实现此switch语句的更智能的方式
Smarter way to implement this switch statement
所以我试图允许用户进行选择,但我遇到了问题。下列线路
cout << "nWhat would you like to do? " << endl
<< "(1) Display the entire List" << endl
<< "(2) to exit" << endl;
getline(cin,answer);
answerint=stoi(answer);
switch (answerint) {
case 1:
showLIST(myLIst);
break;
case 2:
return;
default:
cout << "nPlease choose from the list";
}
因此,如果用户选择了一个整数,这很好,但如果接收到一个字符,它就会弹出。我怎样才能让它不那么易碎?
你似乎想要这样的东西:
if (std::cin >> answerint) {
switch (answerint) {
// ...
}
}
如果输入了不同于int
的内容,则直接从流转换整数会使流处于故障状态。您可能需要添加一个操纵器,以确保行的末尾没有非空格字符。
std::string answer;
int answerint;
while (std::getline(std::cin, answer))
{
std::istringstream iss(answer);
char c; // seek non-whitespace after the number?
if (!(iss >> answerint) || (iss >> c))
answerint = 0;
switch (answerint)
{
...as you had...
}
}
上面的代码使用getline
来确保将一行完整的文本解析为answer
,然后从这一行创建一个不同的std::istringstream
。这样,我们就可以使用>>
,因为我们知道它不会跳过正在消耗或等待进一步输入的换行符。
if (!(iss >> answerint) || (iss >> c))
检查是否没有要解析为answerint
的数字,或者在解析了数字后,行上会出现一个额外的非空白字符。例如,键入的行可能是2r
——我们会认为这是一个错误,并重新尝试选择,将0
分配给answerint
,以确保我们到达switch
中的default
标签,从而打印cout << "nPlease choose from the list";
,这似乎与99
或其他什么一样适合2r
。。。。
通过这种方式使用getline
和单独的istringstream
,可以可靠地尝试从已知状态解析下一行输入。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 如何在c++中为模板函数实例创建快捷方式
- 优先顺序:智能指针和类析构函数
- 在c代码之间共享数据的最佳方式
- 在C++中将函数压缩为两种方式
- 以螺旋方式打印矩阵的程序.(工作不好)
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 创建引用向量的优雅方式
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 智能指针作为无序映射键,并通过引用进行比较
- 不同/较旧的处理器运行c++代码的方式是否不同
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 为什么智能指针不能用通常的指针方式声明
- 如何计算排队多少个字?更智能的方式
- 如何在不同的目标平台上以编程方式智能注册 32 位 COM/DLL 组件
- 调用boost::python::call的更智能方式
- 实现此switch语句的更智能的方式
- 如何使用pthreads以智能的方式向线程共享变量