首页 > 解决方案 > 当我删除 c = getchar() 部分时,为什么默认语句在案例之后起作用?

问题描述

当我删除 getchar 部分时,默认语句有效。

//第一个版本

 int c;
 while ((c = getchar()) != EOF){
    switch(c){

        case 'a': case 'A': printf("aaa"); break;
        default: printf("invalid");

    }
 }

//第二个版本

int c;
 while ((c = getchar()) != EOF){
    switch(c){

        case 'a': case 'A': printf("aaa"); break;
        default: printf("invalid");

    }
    c = getchar();
 }

在第一个版本中,当我输入 a 时,默认部分与(案例 a)一起工作,但是在第二个版本中,情况并非如此。这是为什么 ?

标签: cwhile-loopswitch-statementdefault

解决方案


当您重复使用 getchar() 获取输入时,您需要清除输入缓冲区以扫描另一个输入。

在您发布的第一个版本中,case:'a'正常执行,当程序到达while循环结束时,它需要清除输入缓冲区。所以它自己执行一个扫描操作(通过扫描一个空输入)并再次进入循环。

您可以在 while 循环结束时轻松清理缓冲区:

int c;
 while ((c = getchar()) != EOF){
  switch(c){

    case 'a': case 'A': printf("aaa"); break;
    default: printf("invalid");

  }
  getchar(); // Clear input buffer in order to scan next input.
}

推荐阅读