Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;-第一次运行后跳过代码?_C++_C - Fatal编程技术网

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

C++ C++;-第一次运行后跳过代码?,c++,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, retur

我有一个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”并点击“return”后,它再次运行代码。它将带您到第一个printf(“==”等),但不允许用户执行任何操作,它将直接返回到第二个printf(“\n输入…”

我一步一步地查看代码,然后在第二次运行时,程序跳过了scanf(下面的所有代码都是毫无理由的。最初我认为这是因为“维度”没有被设置为不运行以下方法的值-但我有,即使是这样,程序也会运行这些方法,而不是在没有用户输入的情况下跳过它们

我遗漏了什么吗?scanf(一旦程序已经被使用就不足以停止它吗?

仔细想想:“用户输入'r'并点击return',然后程序读取'r'并重复。输入缓冲区中还剩下什么?按下了两个键,代码只读取第一个


这也是代码需要两次调用
scanf
的原因。第一次调用从输入缓冲区中清除多余字符,第二次调用读取新字符。

您的问题是,当您的程序使用scanf从控制台获得输入时,它会将数据从键盘读入
输入缓冲区de>,然后将值从缓冲区中取出并放入您提供给scanf的位置。问题是,当scanf读取字符时,它也会将
\n
读入缓冲区,然后再次调用时,它会读取放入缓冲区的第二个字符(没有要求你更多的输入——因为它为什么会这样做?它已经在缓冲区中有东西了)

因此有两种解决方案:一种是在stdin上使用
fflush
,就像这样:
fflush(stdin)
。第二种是编写一个while循环,从输入缓冲区中逐个清除字符:
while(getchar()!='\n');

编辑:有关更多阅读,请参见

现在发生的事情 要使缓冲区刷新,需要输入

r<enter>
因此,第一次扫描将读取
r

第二次扫描将读取
\n

因此,当您到达while
键时,
的值为
\n
。测试失败,循环不会重复。因此,您应该删除第二个
scanf()
读取键

所以你移除了第二次扫描。现在会发生什么? 用户类型

r<enter>
scanf()将
r
读入
。循环正确地重复。但是当我们回到
scanf()
时,输入缓冲区中仍然有
\n
字符。因此
scanf()
立即读取此值,循环按其应有的方式存在

你应该怎样修理它。 询问Y/N答案并验证输入是否正确

std::string line;
std::getline(std::cin, line);
while (line != "Y" && line != "N")
{
    std::cout << "Hey cluts enter a correct value. Y/N\n";
    std::getline(std::cin, line);
} 
std::字符串行;
std::getline(std::cin,line);
而(行!=“Y”&&line!=“N”)
{

std::我不想把标签改成C,因为代码只使用C特性,C程序员可能更熟悉该接口。--明显的问题:为什么循环结束时有两个
scanf
?另外,维度的类型是什么,为什么要将其设置为
NULL
?我认为,两个scanf可能是because return可以表示为两个符号-\n和\r?这很奇怪-出于某种原因,应用程序忽略了扫描(如果只有其中一个存在的话,这是部分原因。我真的不明白。我怀疑这就是问题所在,但我不知道如何解决它。我现在将它更改为C标记。@MartinPerry:在这种情况下不是。从文件和std/cin读取时,“行终止序列”(对于平台来说是唯一的)被转换为“\n”(假设文件是以文本模式打开的)。@LokiAstari Ok..谢谢您提供的信息:)
r\n
std::string line;
std::getline(std::cin, line);
while (line != "Y" && line != "N")
{
    std::cout << "Hey cluts enter a correct value. Y/N\n";
    std::getline(std::cin, line);
}