C++;开关回路错误 我是C++初学者。我的问题是,如果用户不小心输入了一封信,程序将发送错误消息,并且不会返回。这是我的代码: #include <string> #include <iostream> using namespace std; int main() { int q; A: cout << "[1] Name"; cout << "\n[2] Address"; cout << "\nEnter your choice: "; cin >> q; switch (q) { case 1: cout << "XXXXXXXXXX" << endl; break; case 2: cout << "XXXXXXXXXX" << endl; break; default: cout << "Error! Enter only numbers from 1 - 2" << endl; goto A; } return 0; }

C++;开关回路错误 我是C++初学者。我的问题是,如果用户不小心输入了一封信,程序将发送错误消息,并且不会返回。这是我的代码: #include <string> #include <iostream> using namespace std; int main() { int q; A: cout << "[1] Name"; cout << "\n[2] Address"; cout << "\nEnter your choice: "; cin >> q; switch (q) { case 1: cout << "XXXXXXXXXX" << endl; break; case 2: cout << "XXXXXXXXXX" << endl; break; default: cout << "Error! Enter only numbers from 1 - 2" << endl; goto A; } return 0; },c++,switch-statement,C++,Switch Statement,应该是这样, [1] Name [2] Address Enter your choice: 8 Error! Enter only numbers from 1 - 2 [1] Name [2] Address Enter your choice: 如果用户输入了一个错误的号码,它会循环返回,如果用户输入了一个字母,它也会这样循环返回。 怎么了 问题在于,当您输入一个非整数输入时,该输入实际上并不是从输入缓冲区中提取的,因此循环的每次迭代都会尝试一遍又一遍地读取相同的输入 您需要做的是

应该是这样,

[1] Name
[2] Address
Enter your choice: 8
Error! Enter only numbers from 1 - 2

[1] Name
[2] Address
Enter your choice:  
如果用户输入了一个错误的号码,它会循环返回,如果用户输入了一个字母,它也会这样循环返回。
怎么了

问题在于,当您输入一个非整数输入时,该输入实际上并不是从输入缓冲区中提取的,因此循环的每次迭代都会尝试一遍又一遍地读取相同的输入

您需要做的是依赖以下事实:非法输入(在您的情况下为非整数)将导致流设置其
failbit
,输入运算符
>
函数返回对流的引用,并且流的状态可以通过简单的方式检查

差不多

if (std::cin >> q)
{
    // Successfully read an integer
}
else
{
    // Failed to read an integer, input is probably something else

    // Clear the failbit
    std::cin.clear();

    // Explicitly ignore the rest of the line
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

    // Output error message
}
if(std::cin>>q)
{
//已成功读取整数
}
其他的
{
//无法读取整数,输入可能是其他内容
//清除故障位
std::cin.clear();
//显式忽略行的其余部分
std::cin.ignore(std::numeric_limits::max(),'\n');
//输出错误消息
}
上面的代码可以放入一个循环中,通过在开关情况下为有效整数设置一个布尔变量退出循环


参考资料:


因为输入可能不是数字,所以让我们考虑一下。我假设使用的是
System.String
——如果不是,修改此代码段将留给学生作为练习

using System;

String entry = "";
int entry_val = 0;
bool valid = false;

do
{
    //menu goes here

    cin >> entry;
    if ( entry >= "1" && entry <= "2" )
    {
        entry_val = entry.ToInt();
        valid = true;
    }
    else
    {
        cout << "Error! Enter only numbers from 1 - 2" << endl;
    }
while (valid == false)
使用系统;
字符串条目=”;
int entry_val=0;
bool valid=false;
做
{
//菜单在这里
cin>>进入;

如果(条目>=“1”&&entry为什么要回圈?您从未进行过回圈。如果您想回圈以获得良好的输入,则需要将该行为编码到程序中。请注意,您缺少每个
案例
末尾的
break;
指令a。这将导致程序继续执行以下
案例
,请注意请告诉我们您对循环所做的尝试,我们无法帮助您找出它的问题所在。不,不,不,不。当语言本身有一个结构化的循环结构时,不要使用
goto
。@CodeswithHammer,一个更好的习惯用法应该是RAII.Huh。我没有想过将
cin
直接放入
If
do
条件。想法不错!那么您定制的字符串类应该有operator=too…来读取stdin中的数字?@NathanOliver:怎么回事?我应该在出现错误时清除
entry
?最初的问题是希望entry循环继续,直到它们得到有效的输入。@Bob\uuuuu:我似乎记得
System.String包含那些运算符。@ CODESH不知道我的坏。条目是一种字符串。如果你要向OP建议,你应该包括一个完整的工作例子。没有任何方法,没有任何代码>字符串< /Cuth>是。C++不是C++,它是C++的CLI,这个问题不是TAG。他对我很感兴趣。
using System;

String entry = "";
int entry_val = 0;
bool valid = false;

do
{
    //menu goes here

    cin >> entry;
    if ( entry >= "1" && entry <= "2" )
    {
        entry_val = entry.ToInt();
        valid = true;
    }
    else
    {
        cout << "Error! Enter only numbers from 1 - 2" << endl;
    }
while (valid == false)