gpt4 book ai didi

c++ - 从 STDIN 读取 int 时的奇怪行为

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:05:28 25 4
gpt4 key购买 nike

假设我们有一个向用户展示一些选项的菜单:

Welcome:
1) Do something
2) Do something else
3) Do something cool
4) Quit

用户可以按 1 - 4,然后按回车键。该程序执行此操作,然后将菜单呈现给用户。无效的选项应该再次显示菜单。

我有以下 main() 方法:

int main()
{
while (true)
switch (menu())
{
case 1:
doSomething();
break;
case 2:
doSomethingElse();
break;
case 3:
doSomethingCool();
break;
case 4:
return 0;
default:
continue;
}
}

和下面的menu():

int menu()
{
cout << "Welcome:" << endl
<< "1: Do something" << endl
<< "2: Do something else" << endl
<< "3: Do something cool" << endl
<< "4: Quit" << endl;

int result = 0;
scanf("%d", &result);
return result;
}

输入数字类型效果很好。输入 1 - 4 会使程序执行所需的操作,然后再次显示菜单。输入此范围之外的数字(例如 -1 或 12)将按预期再次显示菜单。

但是,输入“q”之类的内容只会导致菜单无限地一遍又一遍地显示,甚至不会停下来获取用户输入。

我不明白这怎么可能发生。很明显,menu() 在菜单一次又一次显示时被调用,但是 scanf()menu() 的一部分,所以我不明白程序是如何进入这种不提示用户输入的错误状态的。

我最初有 cin >> result 做完全相同的事情。

编辑:似乎有一个 related question , 然而原来的 source code已从 pastebin 中消失,其中一个答案链接到 article这显然曾经解释了为什么会发生这种情况,但现在是一个死链接。也许有人可以回答为什么会这样而不是链接? :)

编辑:使用this example ,这是我解决问题的方法:

int getNumericalInput()
{
string input = "";
int result;

while (true)
{
getline(cin, input);

stringstream sStr(input);
if (sStr >> result)
return result;

cout << "Invalid Input. Try again: ";
}
}

我只是替换了

int result = 0;
scanf("%d", &result);

int result = getNumericalInput();

最佳答案

当您尝试将非数字输入转换为数字时,它会失败并且(重要的部分)将该数据留在输入缓冲区中,因此下次您尝试读取一个 int 时,它仍然在那里等待,并且一次又一次地失败——一次又一次,永远。

有两种基本方法可以避免这种情况。我更喜欢的方法是读取一串数据,然后将其转换为数字并采取适当的操作。通常,您将使用 std::getline 读取所有数据直到换行符,然后尝试转换它。因为它会读取正在等待的任何数据,所以您永远不会在输入中“卡住”垃圾。

另一种方法是(尤其是在转换失败时)使用 std::ignore 从输入中读取数据(通常)到下一个换行符。

关于c++ - 从 STDIN 读取 int 时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9779659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com