簡體   English   中英

簡易C-忽略scanf()

[英]Easy C - Ignoring scanf()

我正在嘗試學習C,但是在讓我的程序識別scanf()函數時遇到了困難。 我已經在下面包含了我的代碼,並且我確定這是一個愚蠢的錯誤-任何指導都非常感激:)

int i = 0;
int boolean = 1;
while (boolean) {
    printf("Options\n1.Save\n2.Load\n3.Edit\n4.Quit\n");
    scanf("%d", &i);
    if (i==4) {
        boolean--;
        break;
    }
    else if(i <= 3 && i >=1) {
        /*will edit later - irrelevant*/
    }
    else {
        printf("Please enter a valid number");
    }
}

當我運行程序時,甚至沒有提示用戶輸入數字-而是因為布爾值永遠不會為假,所以我陷入了無限循環。 為什么程序不停止並接受用戶輸入?

編輯

我現在看到,與該代碼的不同之處在於,更重要的是,我之前是從文本文件重定向STDIN(我剛剛將其命名為filename,因此在運行程序時從命令行輸入“ ll類型:./myProgram <文件名)這是我的程序不要求用戶輸入更多內容的原因,因為它轉而使用文件名嗎? 我認為它只是從文件名讀取,然后允許我切換回要求用戶輸入數字。

它可以在我的XCode 5,Mac OSX Mavericks機器上運行。 如果這是在主函數上,請確保返回0;否則,請返回0。 函數末尾的行。

如果您忽略scanf()的返回狀態,則您的代碼似乎將忽略scanf()

如注釋中廣泛指出的那樣,您的代碼應更像:

int i = 0;
int boolean = 1;
while (boolean) {
    int rc;
    printf("Options\n1.Save\n2.Load\n3.Edit\n4.Quit\n");
    if ((rc = scanf("%d", &i)) != 1)
    {
        int c;
        printf("DEBUG: scanf failed: rc = %d\n", rc);
        while ((c = getchar()) != EOF && c != '\n')
            printf("DEBUG: next character: %d (%c)\n", c, c);
        break;
    }
    if (i==4) {
        boolean--;
        break;
    }
    else if (i <= 3 && i >=1) {
        printf("DEBUG: i = %d\n", i);
        /*will edit later - irrelevant*/
    }
    else {
        printf("Please enter a valid number!\n");
    }
}

注意否則執行該部分中的調試打印。

我還添加了調試打印功能,以在scanf()失敗后報告輸入行上剩余的字符。 請注意,針對此類問題的首選解決方案是使用fgets()getline()讀取行並使用sscanf()解析行,這使得錯誤報告變得更加簡單; 您需要報告整行,而不是在scanf()完之后剩下的內容。

可以簡化此過程以避免使用名為boolean的變量:

int i = 0;
while (i != 4) {
    int rc;
    printf("Options\n1.Save\n2.Load\n3.Edit\n4.Quit\n");
    if ((rc = scanf("%d", &i)) != 1)
    {
        printf("scanf failed: rc = %d\n", rc);
        break;
    }
    if (i==4) {
        printf("read %d - quit\n", i);
        break;
    }
    else if (i <= 3 && i >=1) {
        printf("DEBUG: i = %d\n", i);
        /*will edit later - irrelevant*/
    }
    else {
        printf("Please enter a valid number!\n");
    }
}

關鍵是測試scanf()的返回值。


掃描儀

#include <stdio.h>

int main(void)
{
    int i = 0;
    while (i != 4)
    {
        int rc;
        printf("Options\n1.Save\n2.Load\n3.Edit\n4.Quit\n");
        if ((rc = scanf("%d", &i)) != 1)
        {
            int c;
            printf("DEBUG: scanf failed: rc = %d\n", rc);
            while ((c = getchar()) != EOF && c != '\n')
                printf("DEBUG: next character: %d (%c)\n", c, c);
            break;
        }
        else if (i == 4)
        {
            printf("Got %d - quitting\n", i);
            break;
        }
        else if (i <= 3 && i >= 1)
            printf("DEBUG: i = %d\n", i);
        else
            printf("Please enter a valid number! (got %d)\n", i);
    }
    printf("After loop\n");
    return 0;
}

匯編

gcc -O3 -g -std=c11 -Wall -Wextra -Werror xscan.c -o xscan  

例子1

$ xscan < xdata.1
Options
1.Save
2.Load
3.Edit
4.Quit
DEBUG: i = 1
Options
1.Save
2.Load
3.Edit
4.Quit
DEBUG: i = 2
Options
1.Save
2.Load
3.Edit
4.Quit
DEBUG: i = 3
Options
1.Save
2.Load
3.Edit
4.Quit
DEBUG: scanf failed: rc = 0
DEBUG: next character: 120 (x)
After loop
$

例子2

$ xscan < xdata.2
Options
1.Save
2.Load
3.Edit
4.Quit
Please enter a valid number! (got 0)
Options
1.Save
2.Load
3.Edit
4.Quit
Please enter a valid number! (got 5)
Options
1.Save
2.Load
3.Edit
4.Quit
Got 4 - quitting
After loop
$

xdata.1

1
2
3
x

xdata.2

0
5
4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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