Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 有人能解释这个输出吗?_C_Scanf_Undefined Behavior_Enter - Fatal编程技术网

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);