int main(void)
{ char ch;
for(; ;)
{
do
{ printf("\n Press 'a' for case a ");
printf("\n Press 'b' for case b ");
printf("\n Press 'c' for case c ");
scanf("%c",&ch);
}while(ch!='a' && ch!='b' && ch!='c');
}
return 0;
}
I / p(1):'z'(说)o / p(1):
按'a'表示案例a 对于案例b,按'b' 对于案例c,按'c' 按'a'表示案例a 对于案例b,按'b' 对于案例c,按'c' i / p(2):“NULL(输入)”
o / p(2):按'a'表示案例a 对于案例b,按'b' 按'c'表示案例c
请解释这种输出背后的原因
答案 0 :(得分:1)
当您输入无效字符时,do
.. while
循环会运行两次' z'因为要阅读两个字符 - ' z'您输入了,以及跟随它的换行符(按enter
)。
如果您不想要这种行为,您可以阅读整行并保留第一个字符,而不是读取单个字符,例如在此示例中使用getchar()
:
do {
int gcres;
printf("\n Press 'a' for case a ");
printf("\n Press 'b' for case b ");
printf("\n Press 'c' for case c ");
ch = getchar();
while ((gcres = getchar()) != '\n' && gcres != EOF);
} while(ch!='a' && ch!='b' && ch!='c');
其中ch = getchar();
将第一个字符读入ch
,
while ((gcres = getchar()) != '\n' && gcres != EOF);
读取行中的剩余字符(包括下一个换行符)。 && gcres != EOF
部分只检查错误/文件结束,以防止错误或文件结束时出现无限循环。
或者,或者,您可以在%c
格式字符串中scanf()
之前添加空格:
scanf(" %c",&ch);
在读取ch
的字符之前会跳过任何空格。但是,这仍将在流中留下以下换行符,因此稍后阅读可能需要处理它。