0

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

这是我输入数字的函数:

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
    }
}

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

号码:你好

-> 格式错误,再试一次!<-

数量:4

继续……

4

4 回答 4

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
于 2013-10-08T22:29:52.533 回答
0

尝试使用检查用户输入并尝试将其解析为 int 的循环。如果它不成功,它可以一直要求用户输入,直到他们输入一个实际的 int。

于 2013-10-08T22:31:17.690 回答
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
    }
}
于 2013-10-08T22:53:02.600 回答
0

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

至少,您需要区分:

  1. 好的
  2. EOF(没有更多可阅读的内容)
  3. 错误(阅读更多,但下一个字符至少不是数字的一部分)

如果您希望每行有一个数字,那么最好使用fgets()and 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. 该代码应该已被编译器拒绝。

于 2013-10-08T22:53:10.727 回答