接受用户输入时的错误处理
error handling when taking user input
我是 c++ 的初学者,我有一个小问题:
我的代码向用户显示一个简单的菜单,提供三个选项:
cout << "nQuadratic equation: a*X^2 + b*X + c = 0 main menu: ";
cout << "n <r> Give new coefficients";
cout << "n <c> Calculate equations solutions";
cout << "n <t> Terminate the program";
我现在想要的是,当用户输入:
- aer ->输入的输入无效,请重试
- 输入 1 或任何其他数字>无效输入,请重试
- rt ->输入无效,请重试(这里第一个字符是正确的,但他输入了 2 个字符)
- cf ->输入的输入无效,请重试
仅当用户正确输入 3 个简单字符(R,C,T 非敏感大小写)之一时。否则,应打印无效输入的按摩,然后再次出现主菜单
我试过这个,但它不起作用:
char displayMainMenu()
{
char mainMenuChoice;
cout << "nQuadratic equation: a*X^2 + b*X + c = 0 main menu: ";
cout << "n <r> Give new coefficients";
cout << "n <c> Calculate equations solutions";
cout << "n <t> Terminate the program";
cout<<"Enter choice : ";
cin>>mainMenuChoice;
return mainMenuChoice;
}
int main()
{
bool done = false;
while(!done)
{
char choice = displayMainMenu();
if( isalpha(choice) )
{
switch(tolower(choice))
{
case 'r':
DoSTH1();
break;
case 'c':
DoSTH2();
break;
case 't':
DoSTH3();
break;
default:
cout<<"Invalid choice!n"<<endl;
}
}
}
return 0;
}
希望你能帮助我
添加:当我错误地输入例如:cbbbbbb它把它当作"C"
要通过"cbbb"被接受为"c",您必须使用 getline() 在一行中读取。 然后,您可以检查是否只输入了一个字符,然后检查输入了哪个字符。
如果使用 cin 读取字符,则它只会读取输入流中可用的第一个字符。
更改此行:
cout<<"Enter choice : " << std::endl;
// ^^^^^^^^^^^^^^^
然后,此打印 '' 强制缓冲区刷新到输出,以便可以读取。
如果只想刷新缓冲区:
cout<<"Enter choice : " << std::flush;
删除 if 语句。不需要使用交换机进行错误检查。
// if( isalpha(choice) )
首先,省略if( isalpha(choice) )
。它不是必需的,因为除了r
、c
或t
之外的任何输入都将落入default
。
实际上,这可能是您问题的原因。如果输入的字符不是字母数字,则该函数将结束而不显示错误消息。
总的来说,我的建议是:不要想得太复杂。开关的美妙之处在于,您可以对完全匹配项进行操作,而所有其他匹配项都将失败default
"我试过这个,但它不起作用"是什么意思? 你得到什么输出? 你的意思是它不编译吗? (它不会处于您显示的状态)。 你的意思是这个项目比我们看到的要多,但它产生了意想不到的结果吗? 我们没有足够的时间来调试它。 对于它的价值,我没有看到任何错误(除了它显然不完整):
#include <iostream>
using namespace std;
char displayMainMenu() {
char mainMenuChoice;
cout << "nQuadratic equation: a*X^2 + b*X + c = 0 main menu: ";
cout << "n <r> Give new coefficients";
cout << "n <c> Calculate equations solutions";
cout << "n <t> Terminate the program";
cout<<"nEnter choice : ";
cin>>mainMenuChoice;
return mainMenuChoice;
}
int main() {
bool done = false;
while(!done) {
char choice = displayMainMenu();
if( isalpha(choice) ) {
switch(tolower(choice))
{
case 'r':
cout << "got 'r'n";
break;
case 'c':
cout << "got 'c'n";
break;
case 't':
cout << "got 't'n";
done = true;
break;
default:
cout<<"Invalid choice!n"<<endl;
}
}
}
return 0;
}
和输出:
~ $ g++ input.cc -o input
~ $ ./input
Quadratic equation: a*X^2 + b*X + c = 0 main menu:
<r> Give new coefficients
<c> Calculate equations solutions
<t> Terminate the program
Enter choice : a
Invalid choice!
Quadratic equation: a*X^2 + b*X + c = 0 main menu:
<r> Give new coefficients
<c> Calculate equations solutions
<t> Terminate the program
Enter choice : c
got 'c'
Quadratic equation: a*X^2 + b*X + c = 0 main menu:
<r> Give new coefficients
<c> Calculate equations solutions
<t> Terminate the program
Enter choice : t
got 't'
~ $
更新我看到它没有为非数字提供"无效选择"消息,但可以通过删除"isalpha"检查来修复。
相关文章:
- 错误处理.将系统错误代码映射到泛型
- 通过错误处理,在C++中可靠地获得用户十六进制输入
- posix_spawn():使用posix_scawn()时的错误处理问题
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 关于 istream 中的错误处理的问题
- 程序使用的 C 库中的错误处理C++
- C++ 错误检查 fstream open() 命令和一般字符串流错误处理
- 使用std::tie进行类似golang的错误处理,同时返回结果,是否有缺点?(C++11)
- Boost进程"系统"功能中的错误处理
- RPN计算器c++错误处理和多个运算符
- 提升精神 x3 错误处理程序与期望
- 构造函数中的错误处理而不会失败
- 当 C++ 中函数参数的输入类型(类)错误时的错误处理
- 关于 ocilib 错误处理的问题,如何使用 ocilib 正确捕获日志错误?
- 我可以使用 std::optional 进行错误处理吗?
- C++ main() 末尾关于错误处理的错误
- 抽象包装带有异常的 C 错误处理的最佳方法
- vwprintf错误处理(ERRNO显示0)
- C++ 使用枚举进行错误处理
- 在 C++ 中创建自己的错误处理机制