我有一个并发循环,如下所示
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(\n nEnter.
我一步一步地看代码是怎么回事,而在第二次运行程序时,我跳过了scanf(以及下面所有的代码,完全没有理由)。最初我认为这是因为没有将“维度”设置为不运行以下方法的值--但我已经设置了,即使是这样,程序也会运行这些方法,而不是在没有用户输入的情况下跳过它们。
我是不是遗漏了什么?扫描(不足以停止程序一旦它已经使用?)
发布于 2013-12-10 20:49:04
您的问题是,当您的程序从控制台获得带有scanf的输入时,它会将数据从键盘读取到input buffer中,然后将值从缓冲区中取出并放置到您提供的位置中。问题是,当scanf读取一个字符时,它也会将\n读入缓冲区,然后在再次被调用时,它会读取放置在缓冲区中的第二个字符(而不要求您提供更多的输入),因为为什么会这样呢?它已经有一些东西在缓冲区中)。
因此有两种解决方案:在stdin上一次使用fflush,类似于:fflush(stdin)。第二步-编写一个while循环,逐个清除输入缓冲区中的字符:while (getchar() != '\n' );。
编辑:有关更多阅读,请参见How to clear input buffer in C?
发布于 2013-12-10 20:46:29
仔细想想:“用户输入'r‘并点击返回”,然后程序读取'r’并重复。输入缓冲区中还剩下什么?有两个键按下了键,代码只读取第一个键。
这也是代码需要两个调用scanf的原因。第一个清除输入缓冲区中的额外字符,第二个读取新字符。
发布于 2013-12-10 20:58:18
现在发生了什么
要使缓冲区刷新,您需要输入
r<enter>点击<enter>会刷新缓冲区。因此,输入缓冲区现在包含两个字符。
r\n所以第一个扫描将读取r
第二个扫描将读取\n
因此,当您到达while key时,它的值为\n。测试失败,循环不重复。因此,您应该删除第二个scanf()读入键。
所以你移除第二次扫描。现在发生了什么?
用户类型
r<enter>这使得输入缓冲区具有:
r\nscanf()将r读入key。循环正确地重复。但当我们回到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);
} https://stackoverflow.com/questions/20504625
复制相似问题