[英]Compare user input with text file in C
我需要讓用戶輸入一個單詞,然后將該單詞與文本文件進行比較,看是否正確。 用戶有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;
}
這里有一些指針:
c = getc(fp)
使用文件的第一個字符,因此它永遠不會成為secret
變量的一部分。 secret.txt
包含換行符,則將換行符讀取到secret
變量中。 while (c != EOF)
循環似乎毫無意義,因為在循環內部未修改c
。 此外,循環的無限性質會阻止外部for
循環正常運行。 如果您是我,我將修復while
循環,並確保正確讀取secret
,例如通過將其打印出來或在調試器中進行檢查。
什么是
c = getc(fp);
需要嗎? 我的猜測是,您將單詞的第一個字符讀入c
,然后secret
漏掉了第一個字符。
編輯:而不是使用getc
進行EOF檢查,正如所說的那樣,它會損壞讀取的單詞(並且無論如何,這while循環都是垃圾),只需檢查fgets
的返回值即可:
if(fgets(secret, sizeof(secret), fp) == NULL)
//file is empty or other error occurred
並刪除此無限while(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;
您的代碼嚴重不正確:您不會在循環內更改'c',從而使其無限期旋轉。 在開始編碼之前,先在紙上畫出算法草圖是一個好主意。 在您的情況下,偽代碼應如下所示:
此時,將其轉換為C或多或少是機械的。 祝好運!
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");
}
}
對我來說似乎是一個無限循環
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.