将 Getline 与 CIN 一起使用以指定用户输入
using getline with cin to specify user input
每当此函数中的输入类型出现错误时,它会自动将 *_cost 的值设置为 0。 为什么会这样?
void Item::setCost(string input){
float entered;
istringstream stin;
stin.str(input);
if(!(stin >> entered)){
do{
cout << "invalid input" << endl;
stin.clear();
getline(cin, input);
stin.str(input);
*_cost = entered;
}
while(!(stin >> entered));
}
else{
*_cost = entered;
}
}
我在主函数中使用该函数,如下所示:
istringstream stin;
string input;
cout << "enter cost" << endl;
getline(cin, input);
items[i]->setCost(input);
您正在将*_cost
设置为一个值,由于 if 语句,该值始终是一个必然不正确的值。 *_cost = entered
行仅在程序通过其"无效输入"代码时执行。程序仅在输入不是合法值时打印"无效输入"。因此,_cost只能设置为非法值。
要解决您的问题,请将*_cost = entered
放在 do-while 循环之后。
我不确定为什么你不只是使用 std::cin 直接读取数据,而不是将标准输入转换为 std::string 的实例,然后转换为 istringstream。
您需要
将第一个*_cost = entered
移出do .. while
块,成为它之后的第一个语句。完成此操作后,您将看到进一步的重构很有帮助,尽管不是必需的。
while(!(stin >> entered))
{
cout << "invalid input" << endl;
stin.clear();
getline(cin, input);
stin.str(input);
}
*_cost = entered;
在代码中执行*_cost = entered;
时,entered
无效。
我刚刚用你的初衷纠正了你的代码
bool Item::setCost(string input) {
bool ret_val = true;
float entered = 0.0;
istringstream stin;
stin.str(input);
while ( !(stin >> entered) ) { // loop till you read a valid input
if ( !stin.rdbuf()->in_avail() ) {
ret_val = false;
break;
}
}
*_cost = entered;
return ret_val;
}
stin.rdbuf()->in_avail()
可用于获取准备从字符串流中读入的可用字符数,您可以使用它来检查字符串流是否为"空"。
例如,如果您想从 istringstream 中提取浮点数,但您得到了其他东西(失败条件),然后查看是否有任何剩余字符(即数字),您可以检查是否stin.rdbuf()->in_avail() == 0
.
相关文章:
- C++如何通过用户输入删除列表元素
- 如何使用用户输入在C++中正确填充2D数组
- C++MySQL C api用户输入行
- 如何只允许用户输入正整数
- C++如何计算用户输入的数字中的偶数位数
- 通过for循环使用用户输入填充列表
- 在C++中,我如何接受不同于同一行的用户输入
- 如果用户输入无效,如何使用字符串变量-C++重复输入命令
- 显示基于用户输入的整数的字符
- 根据用户输入用字母填充矢量,并将"开始"和"结束"放在四肢
- 我试图制作一个程序,要求用户输入问题和答案,但程序循环不正确
- 打印时有二叉树问题.用户输入不打印任何内容
- C ++奇怪的数组由用户输入
- 如何允许大写和小写用户输入?
- C++读取用户输入而不按回车键(Mac OS X),与Turbo Pascal中的读取键相同
- 如何存储用户输入的所有数据,然后在他们想要查看所有数据时显示它们
- 如何使用用户输入变量制作二维数组?
- 用户输入字符串的文件附加问题..C++
- 遇到此问题时遇到困难:允许用户输入数组的值并使用 for,而循环也输出输入的最大数字
- 如何使用递归循环我的代码(当用户输入无效输入时,它会再次提示他们)?