将用户输入与C中的文本文件进行比较

将用户输入与C中的文本文件进行比较,c,file-io,C,File Io,我需要有一个用户输入一个字,然后比较这个字与文本文件,看看它是否正确。在程序终止之前,用户有3次尝试输入单词。我的问题是从文件中读取单词,我知道这很简单,我错了。我还应该澄清,我得到的错误是在编译器中,我还没有达到能够比较字符串的程度 #include <stdio.h> #include <string.h> #include <stdlib.h> int main(void) { FILE *fp; fp = fopen("secret.

我需要有一个用户输入一个字,然后比较这个字与文本文件,看看它是否正确。在程序终止之前,用户有3次尝试输入单词。我的问题是从文件中读取单词,我知道这很简单,我错了。我还应该澄清,我得到的错误是在编译器中,我还没有达到能够比较字符串的程度

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
    FILE *fp;
    fp = fopen("secret.txt","r");
    char guess[10];
    const char secret[10];
    int i, c;
    c = getc(fp);
    fgets(secret, sizeof(secret), fp);

    for (i=0; i < 3; i++)
    {
        printf("Please guess the word: \n");
        scanf("%s", guess);

        while (c !=EOF)
        {   
            if (strcmp(secret,guess)==0)
            {
                printf("Your guess was correct");
                return 0;
            }
            else
            {
                printf("Your guess was incorrect. Please try again\n");
            }
        } 
        fclose (fp);
    }
    return 0;
}
#包括
#包括
#包括
内部主(空)
{
文件*fp;
fp=fopen(“secret.txt”、“r”);
字符猜测[10];
const char secret[10];
int i,c;
c=getc(fp);
fgets(秘密,sizeof(秘密),fp);
对于(i=0;i<3;i++)
{
printf(“请猜猜单词:\n”);
scanf(“%s”,猜测);
而(c!=EOF)
{   
if(strcmp(秘密,猜测)==0)
{
printf(“你的猜测是正确的”);
返回0;
}
其他的
{
printf(“您的猜测不正确。请重试\n”);
}
} 
fclose(fp);
}
返回0;
}

以下是一些提示:

  • c=getc(fp)
    使用文件的第一个字符,因此它永远不会成为
    secret
    变量的一部分
  • 如果
    secret.txt
    包含换行符,则将该换行符读入
    secret
    变量
  • while(c!=EOF)
    循环似乎毫无意义,因为
    c
    没有在循环内部修改。此外,循环的无限性阻止外部
    for
    循环正常工作
  • 如果我是你,我会修复
    while
    循环,并确保正确读取
    secret
    ,例如打印出来或在调试器中检查它

    while (c !=EOF)
    {   
        if (strcmp(secret,guess)==0)
        {
            printf("Your guess was correct");
            return 0;
        }
        else
        {
            printf("Your guess was incorrect. Please try again\n");
        }
    } 
    
    对我来说就像一个无限循环什么是

    c = getc(fp);
    
    需要什么?我的“猜测”是你将单词的第一个字符读入
    c
    ,然后
    secret
    漏掉了第一个字符

    EDIT:不要使用
    getc
    进行EOF检查,正如前面所说的那样,这会损坏读取的字(而且这个while循环是垃圾),只需检查
    fgets的返回值即可:

    if(fgets(secret, sizeof(secret), fp) == NULL)
        //file is empty or other error occurred
    
    并在(c!=EOF)
    循环时删除此无限

    所以它应该看起来像:

    FILE *fp = fopen("secret.txt","r");
    char guess[10];
    const char secret[10];
    int i;
    if(fgets(secret, sizeof(secret), fp) == NULL)
    {
        printf("Error while reading file\n");
        return -1;
    }
    fclose(fp);
    
    for (i=0; i < 3; i++)
    {
        printf("Please guess the word: \n");
        scanf("%s", guess);
        if (strcmp(secret,guess) == 0)
        {
            printf("Your guess was correct");
            return 0;
        }
        else
            printf("Your guess was incorrect. Please try again\n");
    }
    return 0;
    
    FILE*fp=fopen(“secret.txt”、“r”);
    字符猜测[10];
    const char secret[10];
    int i;
    if(fgets(secret,sizeof(secret),fp)=NULL)
    {
    printf(“读取文件时出错\n”);
    返回-1;
    }
    fclose(fp);
    对于(i=0;i<3;i++)
    {
    printf(“请猜猜单词:\n”);
    scanf(“%s”,猜测);
    if(strcmp(秘密,猜测)==0)
    {
    printf(“你的猜测是正确的”);
    返回0;
    }
    其他的
    printf(“您的猜测不正确。请重试\n”);
    }
    返回0;
    
    你的代码太离谱了:你不能在循环中改变“c”,使它无限旋转。在开始编码之前,最好在一张纸上画出算法草图。在您的情况下,伪代码应该如下所示:

    • 打开文件
    • 读秘密
    • 关闭文件
    • 重复三次:
    • ---显示提示
    • ---读取用户输入
    • ---如果用户输入与机密匹配,祝贺用户并退出
    • 告诉用户他的猜测是错误的

    在这一点上,将其转换为C应该或多或少是机械的。祝你好运

    为什么要使用
    c=getc(fp)
    ?使程序循环,直到它读取了文件中的所有字符。这就是我代码中while循环的目的。我已经摆脱了while循环,从而消除了这个问题,但我的问题还在编译阶段。我在尝试从文本文件检索字符串时遇到问题。谢谢你!这并不能回答这个问题。若要评论或要求作者澄清,请在其帖子下方留下评论。@SamIam评论不是sorce code formattable。代码中肯定有一个缺陷,应该指出。(答案可能会迫使OP重新思考他的设计)但自从我写了答案以来,已经快一年了,所以我再也不知道“Werdegang”了。你的答案出现在低质量的帖子队列中,而该评论是自动生成的,因为我选择了一个选项,即它不是真正的答案,因为它不是。