C编程 - 重复scanf直到只输入数字

时间:2013-10-08 22:26:47

标签: c function scanf

我不想做的是检查我的输入是否是数字然后继续,否则打印出错误的格式并要求输入新的输入。我得到的是无限循环打印“错误的格式”

这是我输入数字的函数:

void input_number(int *number)
{

    printf("Number: ");

    if ( scanf("%d", number) == 1 )
        return 0;
    else
    {
        printf("-> Wrong format, try again! <-\n");
        input_number(number); // start over
    }
}

当我运行程序时,我希望它看起来像这样:

号码:你好

- &GT;格式错误,请再试一次! &LT; -

号码: 4

继续......

4 个答案:

答案 0 :(得分:1)

试试这个:(要注意有很多更好的方法可以做到这一点)

void input_number(int *number)
{
    int flag=1;
    printf("Number: ");

    while(flag==1){
        if ( scanf("%d", &number) == 1 ){ // also you were missing & specifier
            flag = 0;
            //return 0;
        }else{
            printf("-> Wrong format, try again! <-\n");
            getchar(); // to catch the enter from the input -- make sure you include stdlib.h

        }
    }

    return 0;
}

<强>输出:

Number: f
-> Wrong format, try again! <-
Number: f
-> Wrong format, try again! <-
Number: d
-> Wrong format, try again! <-
Number: d
-> Wrong format, try again! <-
Number: s
-> Wrong format, try again! <-
Number: s
-> Wrong format, try again! <-
Number: s
-> Wrong format, try again! <-
Number: s
-> Wrong format, try again! <-
Number: 6

答案 1 :(得分:0)

尝试使用检查用户输入的循环并尝试将其解析为int。如果它没有成功,它可以继续询问用户输入,直到他们输入实际的int。

答案 2 :(得分:0)

此时您可能知道代码中存在一些缺陷,并且递归并不是最好的主意。这个是尝试使你的代码工作,漂亮与否。

void input_number(int *number)
{

    printf("Number: ");

    if ( scanf("%d", number) == 1 )
        return 0;
    else
    {
        scanf("%*s"); /* <--this will read and discard whatever caused scanf to fail */
        printf("-> Wrong format, try again! <-\n");
        input_number(number); // start over
    }
}

答案 3 :(得分:0)

我认为问题在于,如果scanf()由于EOF或输入流中存在非数字字符而失败,则当您下次调用它时该问题仍然存在,因此它再次失败,并且这种情况一直持续到程序资源耗尽或耐心耗尽为止。

至少,您需要区分:

  1. EOF(无需再阅读)
  2. 错误(更多内容是阅读,但下一个字符至少不是数字的一部分)
  3. 如果您希望每行有一个号码,那么最好使用fgets()sscanf()。如果您对每行多个数字感到满意,那么您必须更加努力。您可能还应该从函数返回一个值,以指示它是否成功。

    int input_number(int *number)
    {
        char line[4096];
    
        while (printf("Number: ") > 0 && fgets(line, sizeof(line), stdin) != 0)
        {
            if (sscanf(line, "%d", number) == 1)
                return 0;
            printf("-> Wrong format, try again! <-\n");
        }
        return EOF;
    }
    
    int input_number(int *number)
    {
        while (printf("Number: ") > 0 && scanf("%d", number) != 1)
        {
            int c;
            if (feof(stdin) || ferror(stdin))
                return EOF;
            printf("-> Wrong format, try again! <-\n");
            while ((c = getchar()) != EOF && c != '\n')
                ;
            if (c == EOF)
                return EOF;
        }
        return 0;
    }
    

    注意正确使用feof(); I / O操作失败,代码需要区分EOF和I / O错误以及格式错误。

    在第二个函数中,如果printf()失败,则会错误地告知您读取了一个数字。如果这是一个问题,请添加额外的测试,但该代码比使用fgets()的代码更难编写,因此请谨慎决定使用它。

    请注意,原始代码在返回return 0;的函数中有void。代码应该被编译器拒绝。