我自己一直在学习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
答案 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
,如果有)和strtol
。 scanf
诱人方便,但几乎总是比它的价值更麻烦。
答案 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);