我有一个 do-while 循环,如下所示
do
{
dimensions = NULL;
printf("=======================================\nDo you want to multiply in 2 dimensions, or 3?\n\n");
scanf("%c", &dimensions);
... //do stuff
printf("\nEnter r to repeat, return to terminate\n");
scanf("%c", &key);
scanf("%c", &key);
}
while(key == 'r');
在第一次运行时,它执行得很好。然而,问题是当它在用户输入“r”并点击回车后再次运行代码时。它会带你到第一个 printf("==== 等等,但不允许用户做任何事情,它会直接回到第二个 printf("\nEnter...
我逐步查看代码以查看发生了什么,在第二次运行程序时完全没有理由地跳过了 scanf( 和所有后续代码。最初我认为这是因为“维度”没有被设置为不运行以下方法的值 - 但我有,即使是这种情况,程序也会运行这些方法,而不是在没有用户输入的情况下跳过它们。
我错过了什么吗? scanf( 是否不足以在程序已被使用后停止程序?
最佳答案
你的问题是,当你的程序使用 scanf 从控制台获取输入时,它从键盘读取数据到 input buffer
,然后从缓冲区中取出值并将其放入位置你提供给scanf。问题是,当 scanf 读取一个字符时,它还会将 \n
读入缓冲区,然后在再次调用时,它会读取放入缓冲区的第二个字符(不要求您提供更多输入 - 因为为什么会这样?缓冲区中已经有东西了)。
因此有两种解决方案:一种 - 在 stdin 上使用 fflush
,如下所示:fflush(stdin)
。其次 - 编写一个 while 循环,从输入缓冲区中一个一个地清除字符:while (getchar() != '\n' );
编辑:有关更多阅读,请参阅 How to clear input buffer in C?
关于C++ - 第一次运行后跳过代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20504625/