C++ - 第一次运行后跳过代码?

标签 c++ c

我有一个 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/

相关文章:

c++ - 改变类对象数量的 vector

c++ - 使用 Luabind 处理事件回调

c++ - 使用继承在 C++ 中调用析构函数和销毁成员变量的顺序是什么?

C函数没有返回正确的结果

c - 即时将程序输出重定向到文件,无需从批处理文件中缓冲

计算 I/O 模型的值

java - 正弦的多项式逼近中的这些系数是如何确定的?

c - 如何在 C 程序中设置命令行参数,以便在用户键入 "ps aux"时可见?

c++ - Xcode 生成的存档文件缺少 dylib

C++ 字符串初始化