簡體   English   中英

將用戶輸入與C中的文本文件進行比較

[英]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;
}

這里有一些指針:

  1. c = getc(fp)使用文件的第一個字符,因此它永遠不會成為secret變量的一部分。
  2. 如果secret.txt包含換行符,則將換行符讀取到secret變量中。
  3. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM