有没有人知道为什么这总是为不同于1或0的值循环,以及如何在给出字符作为输入的情况下避免无限循环?
#include <stdio.h>
int a;
main()
{
do
{
puts("Give 1 or 0 for input:");
scanf("%d",&a);
} while(a!=0 || a!=1);
printf("\n%d",a);
return 0;
}
答案 0 :(得分:3)
循环终止的唯一方法是a!=0
和a!=1
都为假。换句话说:它只能在a == 0
和a == 1
同时结束。这当然是不可能的,所以循环永远不会终止。
如果你想在用户输入1
或0
时循环终止,那么你需要一个逻辑和运算符:
do
{
puts("Give 1 or 0 for input:");
scanf("%d",&a);
} while(a!=0 && a!=1);
除此之外,您必须检查scanf
的返回值,并在发生故障时清除输入流。如果您输入了一个字符,那么scanf
将表示它失败,但将该字符留在输入流中。随后的迭代将只是试图读取该字符。
这样做的一种方法是使用scanf
本身和%*s
格式说明符。
do
{
puts("Give 1 or 0 for input:");
int read_res = scanf(" %d",&a);
if (read_res != 1)
scanf("%*s");
} while(a != 0 && a != 1);
格式字符串中的星号表示scanf
仍将匹配任何非空白字符并从流中清除它们,但不会尝试将它们分配到任何内容中(因此不需要额外的参数)。我还在%d
添加了一个前导空格,以便在数字前忽略任何前导空格。