首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++ -在第一次运行后跳过代码?

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

Stack Overflow用户
提问于 2013-12-10 20:33:16
回答 3查看 297关注 0票数 0

我有一个并发循环,如下所示

代码语言:javascript
运行
复制
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(以及下面所有的代码,完全没有理由)。最初我认为这是因为没有将“维度”设置为不运行以下方法的值--但我已经设置了,即使是这样,程序也会运行这些方法,而不是在没有用户输入的情况下跳过它们。

我是不是遗漏了什么?扫描(不足以停止程序一旦它已经使用?)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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?

票数 1
EN

Stack Overflow用户

发布于 2013-12-10 20:46:29

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

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

票数 0
EN

Stack Overflow用户

发布于 2013-12-10 20:58:18

现在发生了什么

要使缓冲区刷新,您需要输入

代码语言:javascript
运行
复制
r<enter>

点击<enter>会刷新缓冲区。因此,输入缓冲区现在包含两个字符。

代码语言:javascript
运行
复制
r\n

所以第一个扫描将读取r

第二个扫描将读取\n

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

所以你移除第二次扫描。现在发生了什么?

用户类型

代码语言:javascript
运行
复制
r<enter>

这使得输入缓冲区具有:

代码语言:javascript
运行
复制
r\n

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

你该怎么修理它。

询问Y/N的答案,并验证输入是否正确。

代码语言:javascript
运行
复制
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);
} 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20504625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档