while while循环提供意外输出

时间:2015-08-28 16:33:27

标签: c do-while

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

请解释这种输出背后的原因

1 个答案:

答案 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的字符之前会跳过任何空格。但是,这仍将在流中留下以下换行符,因此稍后阅读可能需要处理它。