C文件处理查询

C文件处理查询,c,string,file,C,String,File,所以我有一个程序,它接受用户输入并将其与文件中的特定行进行比较,但是最后一行总是被认为是不正确的,所以有人能帮我解决这个问题吗?谢谢 文件内容(只是随机单词列表) (库包括stdio、conio和string) 字符文本[100],空白[100]; int c=0,d=0; 空隙(void); int main() { int循环=0; char-str[512]; 字符串[512]; 内线=1; int-dis=1; 智力得分=0; 字符文本[64]; 文件*fd; fd=fopen(“Stu

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

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

(库包括stdio、conio和string)

字符文本[100],空白[100];
int c=0,d=0;
空隙(void);
int main()
{
int循环=0;
char-str[512];
字符串[512];
内线=1;
int-dis=1;
智力得分=0;
字符文本[64];
文件*fd;
fd=fopen(“Student Usernames.txt”,“r”);//应该测试
如果(fd==NULL)
{
printf(“打开文件失败\n”);
出口(1);
}
做
{
printf(“输入字符串:”);
获取(文本);
而(文本[c]!='\0')
{
如果(!(文本[c]=''和文本[c]='')
{
字符串[d]=文本[c];
d++;
}
C++;
}
字符串[d]='\0';
printf(“删除空格后的文本\n%s\n”,字符串);
getch();
对于(loop=0;loop一些观察结果:

决不能使用
gets
(甚至不再是C11标准中的了)。使用
fgets(text)
而不是
fgets(text,sizeof(text),stdin)
——这样长时间的输入将不会溢出
文本数组

最后会打印一些内容,因为您没有检查
get
fgets
的返回值,所以当文件或用户输入的文件结束时,其余的迭代仍会运行。
fgets
如果没有读取任何内容,则返回
NULL
,请检查该值,而不是u唱《费奥夫》

您可以从文件输入中删除换行符,但不能从用户输入中删除换行符,因此当您从
get
切换到
fgets
(不带换行符)时,比较总是会失败。
text[c]
'
的第二次比较(否则毫无意义)应该与
'\n'
进行比较

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

(loop=0;loop
-loop的
是无意义的,因为
line
总是1,所以主体只执行一次

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


函数
getch()
是非标准的。没有简单的直接替换方法,因此您可以接受您没有编写可移植代码,但这是需要注意的。

!(text[c]=''&&text[c]=''与刚才的
text[c]!='
“库是…”应该改为“头是…”。代码似乎不完整,例如,
do
没有
。那么我应该如何处理for循环?,将行更改为EOF?@user3344560我不知道你的循环点应该是什么,但是如果当前行为正确,你可以什么也不做(留下一个毫无意义的坏循环),或删除循环,但不删除内部的
fgets
。@user3344560鉴于您对基本相同代码的新问题,请重新阅读此答案。我还添加了一个可能有帮助的编辑。
Baby
Milk
Car
Face
Library
Disc
Lollipop
Suck
Food
Pig
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();
}