C 有人能解释这个输出吗?
当我遇到这个问题时,我正在进行一些程序C 有人能解释这个输出吗?,c,scanf,undefined-behavior,enter,C,Scanf,Undefined Behavior,Enter,当我遇到这个问题时,我正在进行一些程序 #include<stdio.h> void main() { char z; do { printf("1st line\n"); printf("2nd line\n"); scanf("%c",&z); switch(z) { case 'a':printf("this is case a\n"); break; ca
#include<stdio.h>
void main()
{
char z;
do
{
printf("1st line\n");
printf("2nd line\n");
scanf("%c",&z);
switch(z)
{
case 'a':printf("this is case a\n");
break;
case 'b':printf("this is case b\n");
break;
case 'c':printf("Exit\n");
return;
break;
default:
printf("this is default\n");
break;
}
}while(1);
}
第一次输入时,输出是正确的。但是,在给出第一个输入并第二次启动循环之后,scanf语句根本不会执行。printf语句会执行,默认情况下也是如此
一线
二线
B
这是案例b
一线
二线
这是默认值
一线
二线
当您在第一次scanf呼叫中输入b时,您还点击了。当scanf%c,&z处理此输入时,它将换行符保留在输入流中
第二组输出是由于scanf读取b后面的换行符。因为\n既不是a,也不是b,也不是c,所以它符合默认情况
您可以通过修改scanf字符串来修复行为,使其更符合预期:
请注意%c之前的空格字符。这将导致scanf在处理输入之前跳过包括换行符在内的空白字符
int main
这里没有未定义的行为。只是scanf没有像你想象的那样工作c消耗一个字符。人物。一而且它不会使用在您点击Enter后留在stdin缓冲区中的换行符。因此,第二个未执行的scanf是不正确的-它已执行,并处理为其保留的任何内容。现在,换行符不是a、b或c中的任何一个,因此switch语句继续以默认值:label执行
如果要从标准输入中读取字符,可靠的方法是:
char buf[LINE_MAX];
fgets(buf, sizeof buf, stdin);
switch (buf[0]) {
// etc.
}
备选方案:
int c = fgetc(stdin);
while (fgetc(stdin) == '\n')
;
不要使用scanf。至少在你明白它的作用之前。这很糟糕。没什么大问题,您只需忽略处理每个字符后面的“\n”输入,您可以这样做:
scanf("%c\n",&z);
为了避免处理“\n”。+1,我同意通常应该避免使用scanf。@H2CO3,我用Eclipse和gcc测试了这个示例,它的行为与OP预期的一样。这是否意味着eclipse没有将\n放入流中?我还认为返回键可能是问题所在,因此我对它的工作原理感到惊讶。当在控制台上运行它时,正如您所描述的,因此Eclipse似乎确实吞下了\n本身。@Devlus我认为在这种情况下它确实吞下了。谢谢你给我另一个讨厌IDE的理由,我收集这些!
scanf("%c\n",&z);