将用户输入与C中的文本文件进行比较
我需要有一个用户输入一个字,然后比较这个字与文本文件,看看它是否正确。在程序终止之前,用户有3次尝试输入单词。我的问题是从文件中读取单词,我知道这很简单,我错了。我还应该澄清,我得到的错误是在编译器中,我还没有达到能够比较字符串的程度将用户输入与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.
#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”了。你的答案出现在低质量的帖子队列中,而该评论是自动生成的,因为我选择了一个选项,即它不是真正的答案,因为它不是。