我似乎在這里失去了對我的指標的參考。我不知道為什么,但我懷疑是 fgets 回傳的指標搞砸了。有人告訴我,從檔案中讀取單詞的一種好方法是獲取行,然后用 strok 分隔單詞,但是如果我在 words[i] 中的指標不斷消失,我該怎么做。
文本
Natural Reader is
john make tame
結果我得到了。
array[0] = john
array[1] = e
array[2] =
array[3] = john
array[4] = make
array[5] = tame
int main(int argc, char *argv[]) {
FILE *file = fopen(argv[1], "r");
int ch;
int count = 0;
while ((ch = fgetc(file)) != EOF){
if (ch == '\n' || ch == ' ')
count ;
}
fseek(file, 0, SEEK_END);
size_t size = ftell(file);
fseek(file, 0, SEEK_SET);
char** words = calloc(count, size * sizeof(char*) 1 );
int i = 0;
int x = 0;
char ligne [250];
while (fgets(ligne, 80, file)) {
char* word;
word = strtok(ligne, " ,.-\n");
while (word != NULL) {
for (i = 0; i < 3; i ) {
words[x] = word;
word = strtok(NULL, " ,.-\n");
x ;
}
}
}
for (i = 0; i < count; i)
if (words[i] != 0){
printf("array[%d] = %s\n", i, words[i]);
}
free(words);
fclose(file);
return 0;
}
uj5u.com熱心網友回復:
strtok 不分配任何記憶體,它回傳一個指向緩沖區中分隔字串的指標。
因此,如果要在回圈迭代之間保留單詞,則需要為結果分配記憶體
例如
word = strdup(strtok(ligne, " ,.-\n"));
uj5u.com熱心網友回復:
您還可以通過對讀取的每一行使用唯一的來處理此問題ligne,因此將其設為字串陣列,如下所示:
char ligne[20][80]; // no need to make the string 250 since fgets limits it to 80
然后你的 while 回圈變為:
int lno = 0;
while (fgets(ligne[lno], 80, file)) {
char *word;
word = strtok(ligne[lno], " ,.-\n");
while (word != NULL) {
words[x ] = word;
word = strtok(NULL, " ,.-\n");
}
lno ;
}
根據需要為檔案的最大大小調整第一個下標,或者如果您不想要這么低的限制,則在每次迭代期間動態分配行緩沖區。如果您的實作支持,您也可以使用getline而不是fgets;它可以處理分配,但您需要在完成后釋放塊。
如果您正在處理現實世界的散文,您可能希望在串列中包含其他分隔符,例如冒號、分號、感嘆號和問號。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/446154.html
