0

当我遇到这个时,我正在经历一些程序。

#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 语句虽然被执行,但也是默认情况。

第 1 行
第 2 行
b
这是案例 b
第 1 行
第 2 行
这是默认值
第 1 行
第 2 行

4

3 回答 3

6

当您输入b第一个scanf电话时,您还按。处理此输入时scanf("%c", &z),它会将换行符留在输入流中。

第二组输出是由于scanf读取了后面的换行符b。因为\nis not a, nor b, nor c,所以它符合默认情况。

scanf您可以通过修改字符串来修复行为,使其更像您所期望的:

scanf(" %c", &z);

注意 . 之前的空格字符%c。这将导致scanf在处理输入之前跳过空白字符(包括换行符)。

于 2013-07-14T06:31:52.817 回答
4
  1. int main().

  2. 这里没有未定义的行为。只是它scanf()不像你想象的那样起作用。%c消耗一个字符。一个字符。一。并且它不会消耗stdin您按 Enter 后留在缓冲区中的换行符。(所以“第二个 scanf 没有执行”是不正确的 - 它已执行并处理剩下的任何内容。)现在,换行符不是 a、b 或 c 之一,因此switch语句继续执行default:标签。


如果要从标准输入中读取字符,可靠的方法是:

char buf[LINE_MAX];
fgets(buf, sizeof buf, stdin);
switch (buf[0]) {
    // etc.
}

选择:

int c = fgetc(stdin);
while (fgetc(stdin) == '\n')
    ;

不要使用scanf(). (至少在你理解它的作用之前不会。)它是邪恶的。

于 2013-07-14T06:32:40.620 回答
1

没什么大问题,你只是忽略处理每个字符后的 '\n' 输入,你可以这样做:

scanf("%c\n",&z);

这样您就可以避免处理'\n'。

于 2013-07-14T07:55:06.070 回答