C文件处理查询

所以我有一个程序,它接受用户输入并将其与文件中的特定行进行比较,但是最后一行总是被认为是不正确的,所以有人能为我解决这个问题吗?谢谢。

文件内容(只是一个随机单词列表)

Baby Milk Car Face Library Disc Lollipop Suck Food Pig 

(库是stdio,conio和string)

 char text[100], blank[100]; int c = 0, d = 0; void space(void); int main() { int loop = 0; char str[512]; char string[512]; int line = 1; int dis = 1; int score = 0; char text[64]; FILE *fd; fd = fopen("Student Usernames.txt", "r"); // Should be test if (fd == NULL) { printf("Failed to open file\n"); exit(1); } do { printf("Enter the string: "); gets(text); while (text[c] != '\0') { if (!(text[c] == ' ' && text[c] == ' ')) { string[d] = text[c]; d++; } c++; } string[d] = '\0'; printf("Text after removing blanks\n%s\n", string); getch(); for(loop = 0;loop<line;++loop) { fgets(str, sizeof(str), fd); } printf("\nLine %d: %s\n", dis, str); dis=dis+1; str[strlen(str)-1] = '\0'; if(strcmp(string,str) == 0 ) { printf("Match\n"); score=score+2; } else { printf("Nope\n"); score=score+1; } getch(); c=0; d=0; } while(!feof(fd)); printf("Score: %d",score); getch(); } 

对于最后一行的任何输入,输出总是不正确的,我相信这与for循环没有把它变成下一个变量有关,但是看到<= notation使这个程序变得更糟,我真的只需要一个简单的程序修复感谢。

一些观察:

你必须永远不要使用gets (它甚至不再符合C11标准)。 而不是gets(text)使用fgets(text, sizeof(text), stdin) – 这样一个长输入不会溢出text数组。

最后会打印一些东西,因为你没有检查getsfgets的返回值,所以当文件结束文件或用户输入时,该迭代的其余部分仍然会运行。 如果fgets没有读取任何内容,则返回NULL – 检查它而不是使用feof

您从文件输入中删除换行符,但不从用户输入中删除换行符,因此当您从gets切换到fgets (不会删除换行符)时,比较将始终失败。 text[c]' '的第二个(否则无意义)比较应该反对'\n'

编辑 :此外,如果文件的最后一行没有以换行符结束,则比较将在最后一行失败,因为在删除之前不检查最后一个字符是否为换行符。

for (loop = 0; loop < line; ++loop) -loop是没有意义的,因为line总是1,所以body只执行一次。

你有不必要的全局变量,程序很难遵循。 而且,例如,你的本地text[64]掩盖了全局text[100] ,所以如果你认为你正在修改全局缓冲区,那么你就不是。 如果您的代码完整,则所有变量都不应该是全局的。

函数getch()是非标准的。 没有简单的直接替换,所以你可能只是接受你不是在编写可移植的代码,但这是需要注意的。