所以我有一个程序,它接受用户输入并将其与文件中的一行进行比较,然后再进入下一行,如果用户正确理解了单词,他们将获得 2 分,如果错误,他们将获得 1 分。作为故障保护,我在程序中添加了一个小功能,可以删除单词中的所有空格。
程序按预期工作,空格被删除,运行时所有单词都会被有效扫描和比较。
但是,一旦到达文件的最后一行,单词的正确拼写将给出错误的输出,这可能与循环有关,但我不确定。
简而言之:我所需要的只是你们中有一位才华横溢的程序员来看看我的代码,看看是什么导致了这种情况的发生。
文件内容(只是随机单词的列表)
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 循环没有将其转换为下一个变量有关,但是看到 <= 符号使这个程序变得更糟,我真的只需要对程序进行简单的修复,谢谢。
附注对于任何要评论我的空间函数编码的人,是的,我可以做得更好,但现在这不是问题。所以请不要写任何与此相关的内容。
最佳答案
我猜你的文件不是由换行符终止的。因此,最后一个单词 Pig
被这行代码截断:
str[strlen(str)-1] = '\0';
(无条件)。
在文件末尾添加换行符,或者在截断之前检查字符串结尾:
if (isspace(str[strlen(str)-1]))
str[strlen(str)-1] = '\0';
(也可以使用 strtok
从字符串中删除所有空格,而无需编写棘手的代码)
关于C:从文件读取有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22027039/