我有以下C代碼,它將給程序的單詞寫入名爲「command.txt」的文件。如果單詞是「退出」程序結束,否則它打印該單詞並將其寫入文件。但是,如果單詞是「文件」,則通過使用函數getstring()獲取文件第一行的第一個單詞並繼續下一次循環迭代。然後在新一輪中使用這個單詞,代碼直接轉到「else」 - 分支,並打印出單詞並將其寫入文件。爲什麼C程序打印空行到文件?
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void getstring(char **p) {
char string[100];
char *word = NULL;
FILE *file = fopen("command.txt", "r");
fgets(string, 100, file);
word = strtok(string," \n");
p[0] = word;
fclose(file);
}
void writetofile (char **strarr) {
FILE *file = fopen("command.txt", "a");
fprintf(file, "%s\n", strarr[0]);
fclose(file);
}
int main(void) {
char line[100];
char *word = NULL;
char *strarr[5];
char **p = NULL;
int flag = 0, i;
while (1) {
if (flag == 1) {
flag = 0;
}
else {
printf("Give string: ");
fgets(line, 100, stdin);
word = strtok(line," \n");
strarr[0] = word;
}
if (strcmp(strarr[0], "quit") == 0) {
break;
}
else if (strcmp(strarr[0], "file") == 0) {
p = strarr;
getstring(p);
flag = 1;
continue;
}
else {
printf("Text: %s\n", strarr[0]);
writetofile(strarr);
}
for (i=0; i<5; i++) {
strarr[i] = NULL;
}
}
return 0;
}
問題是這樣的:如果我輸入「文件」沒有寫入文件。例如,如果我給的話「你好」,「程序文件」和「世界」,然後退出程序打印輸出看起來是這樣的:
Give string: hello
Text: hello
Give string: file
Text: hello
Give string: world
Text: world
Give string: quit
command.txt看起來是這樣的:
hello
world
所以,有一個空行應該是另一個「你好」。爲什麼是這樣?我在這裏丟失了一些明顯的東西,還是因爲指針被使用的方式?
使用調試器檢查'strtok'調用後'word'指向的數據。在最後可能還有一個回車符('\ r')導致'strcmp'不匹配。 – 2014-11-02 17:49:38
這些行:word = strtok(line,「\ n」); strarr [0] =單詞;總是將strarr [0]設置爲指向行[]數組I.E中的第一個字符。 &線[0]。所以簡單地說strarr [0] = line會更清楚; – user3629249 2014-11-02 18:22:36
字符指針數組strarr [5]只有一個指針設置。 I.E. strarr [0],因此不需要將所有指針設置爲null的循環,也不需要用於char * strarr之外的任何其他用途。然後總是引用它作爲strarr。 char ** p = NULL並且所有對p服務器的引用都沒有用處,所以用strarr替換p的所有引用 – user3629249 2014-11-02 18:29:08