0

我一直在自学 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

4 回答 4

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; }在两者之间添加一个条件,但在我看来,在条件中进行分配更干净。

于 2013-05-22T15:50:54.523 回答
2

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

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

此外,您get_int最好使用fgets(或getline如果可用)和strtol. scanf是诱人的方便,但几乎总是比它的价值更多的麻烦。

于 2013-05-22T15:51:19.050 回答
2

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

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

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

于 2013-05-22T15:53:20.803 回答
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);
于 2013-05-22T15:51:52.580 回答