Запрос обработки файла C

Таким образом, у меня есть программа, которая принимает пользовательский ввод и сравнивает его с определенной строкой в ​​файле, однако окончательная строка всегда будет зачислена как некорректная, так что может кто-то решить это для меня ?, спасибо.

Содержимое файла (только список случайных слов)

Baby Milk Car Face Library Disc Lollipop Suck Food Pig 

(библиотеки – stdio, conio и строка)

 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(); } в 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 не превращает его в следующую переменную, но, видя, что <= нотация делает эту программу хуже, мне просто нужно простое исправление для программы спасибо.

Некоторые наблюдения:

Вы никогда не должны использовать gets (это даже не в стандарте C11). Вместо gets(text) используйте fgets(text, sizeof(text), stdin) – таким образом длинный ввод не будет переполнять text массив.

В конце будет напечатан материал, потому что вы не проверяете возвращаемое значение либо gets либо fgets , поэтому, когда конец файла происходит либо для файла, либо для ввода пользователем, остальная часть этой итерации все еще выполняется. fgets возвращает NULL если он ничего не читал – проверьте это вместо использования feof .

Вы удаляете новые строки из ввода файла, но не с пользовательского ввода, поэтому сравнение всегда будет терпеть неудачу, если вы переключитесь с того, чтобы перейти к fgets (который не разбивает линейные переводы). Второе (в противном случае бессмысленное) сравнение text[c] с ' ' должно быть против '\n' .

edit : Кроме того, в случае, если последняя строка вашего файла не заканчивается линией, сравнение завершится неудачно в последней строке, потому что вы не проверяете, является ли последний символ линией, прежде чем вы удалите ее.

Цикл for (loop = 0; loop < line; ++loop) -loop бессмыслен, потому что line всегда 1, поэтому тело выполняется только один раз.

У вас есть ненужные глобальные переменные, которым трудно следовать. И, например, ваш локальный text[64] затмевает глобальный text[100] , поэтому, если вы считаете, что вы изменяете глобальный буфер, это не так. Если ваш код завершен, ни одна из переменных не должна быть глобальной.

Функция getch() нестандартна. Нет простой замены, поэтому вы можете просто согласиться с тем, что вы не пишете переносимый код, но это то, о чем нужно знать.