【问题标题】:C file handling queryC文件处理查询
【发布时间】:2014-02-25 18:35:05
【问题描述】:

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

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

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();
}

对于最后一行的任何输入,输出总是不正确的,我相信这与 for 循环没有将其转换为下一个变量有关,但是看到

【问题讨论】:

  • !(text[c] == ' ' &amp;&amp; text[c] == ' ') 与 text[c] != ' ' 相同。
  • “libraries are ...”应为“headers are ...”。
  • 代码似乎不完整,例如do 没有 while。

标签: c string file


【解决方案1】:

一些观察:

您绝不能使用gets(它甚至不再在 C11 标准中)。而不是gets(text) 使用fgets(text, sizeof(text), stdin) - 这样长输入不会溢出text 数组。

最后会打印一些内容,因为您没有检查gets 或fgets 的返回值,因此当文件或用户输入的其余部分发生文件结束时迭代仍在运行。如果fgets 没有读取任何内容,则返回NULL - 检查而不是使用feof。

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

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

for (loop = 0; loop &lt; line; ++loop) 循环毫无意义,因为line 始终为 1,因此主体只执行一次。

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

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

【讨论】:

  • 那么我应该如何处理for循环?,将行改为EOF?
  • @user3344560 我不知道您对循环的看法应该是什么,但如果当前行为正确,您可以什么都不做(以不良风格留下毫无意义的循环),或者删除循环,但不是里面的fgets。
  • @user3344560 鉴于您对基本相同代码的新问题,请重新阅读此答案。我还添加了一个可能有帮助的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
  • 2011-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多