整数验证输出

时间:2013-05-22 15:47:25

标签: c

我自己一直在学习C,并且已经从C Primer书中重新编写了一个程序。我希望一双新鲜的眼睛能够发现我遇到的一个问题。正如您可以通过我的输出与预期输出看到的,我想摆脱这条线" 0是一个数字"。我相信对while循环进行重新设计是一个问题,但我似乎无法摆脱它,尽管我尝试过各种变化。

输出:

    Enter some integers. Enter 0 to end.
    1 two 3 0 4
    1 is a number.
    two is not an integer
    3 is a number.
    0 is a number.

预期产出:

    Enter some integers. Enter 0 to end.
    1 two 3 0 4
    1 is a number.
    two is not an integer
    3 is a number.
#include <stdio.h>
#include <ctype.h>

int get_int(void); //validate that input is an integer

int main(void)
{
    int integers;

    printf("Enter some integers. Enter 0 to end.\n");
    while (integers != 0)
    {
        integers = get_int();
        printf("%d is a number\n", integers);
    }
    return(0);

} // end main

int get_int(void)
{
    int input;
    char ch;

    while (scanf("%d", &input) != 1)
    {
        while (!isspace(ch = getchar()) )
            putchar(ch); //dispose of bad input
        printf(" is not an integer\n"); 
    }    
    return input;
 }// end get_int

4 个答案:

答案 0 :(得分:6)

我要做的是将调用移至get_int进入while循环的条件:

int main(void)
{
    int integers;

    printf("Enter some integers. Enter 0 to end.\n");
    while ((integers = get_int()) != 0)
    {
        printf("%d is a number\n", integers);
    }
    return(0);

} // end main

现有代码的问题在于,在调用get_int()和打印值之间,您不会检查它是否已返回0的哨兵。

另一种选择是在两者之间添加if (integers == 0) { break; }条件, 但在我看来,在条件下完成任务更清晰。

答案 1 :(得分:2)

怀疑您需要重新调整while循环是正确的。你尝试过这样的事吗?

 for (;;)
 {
     integers = get_int();
     if (integers == 0) break;
     printf("%d is a number\n", integers);
 }

另外,get_int可以更好地使用fgets(或getline,如果有)和strtolscanf诱人方便,但几乎总是比它的价值更麻烦。

答案 2 :(得分:2)

最简单的方法是将条件和赋值放入while循环中。现在你的代码依赖于在循环中设置integer,然后再次循环以检查它是否为零。

while((integer = get_int()) != 0)

将允许您在分配整数的同时进行检查。不要忘记括号,否则您的整数值将是integer = (get_int != 0)的结果,因为!=在C和C ++中的优先级高于=

答案 3 :(得分:1)

考虑循环的核心:

integers = get_int();
printf("%d is a number\n", integers);

无论get_int()返回什么,都会执行printf行。该行需要单独的if

integers = get_int();
if (integers != 0) printf("%d is a number\n", integers);