C++ C++;-第一次运行后跳过代码?
我有一个do-while循环,如下所示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
{
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);
}