【发布时间】:2015-08-08 12:26:25
【问题描述】:
我很好奇为什么cin 的行为方式如下。我想我可能有
对其行为的一些误解。
考虑一下这个简单的代码。此代码要求输入一些输入,所有这些都在最后一条语句中打印出来。
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char** argv) {
cout << "Please enter your input: " ;
int a=3, b=87; // initialized to some random integers
string s = "Mary" ; // initialized to a random string
cin >> a ;
cin >> b ;
getline(cin,s);
cout << "You entered the following " << a << " " << b << " " << s << endl;
return 0;
}
现在如果输入是12 34 cat,输出是12 34 cat
这是意料之中的。
但是,如果输入为 cat 23 dog,则输出为 0 87 Mary。
这就是为什么我认为这是出乎意料的:
cin >> a 应该会失败,因为 cat 无法转换为整数。但是,a 被我认为是垃圾值所取代。
现在由于输入的第二个数字是整数 23,cin >> b 必须成功。然而这个操作似乎失败了,b 继续保持其原始值,这与a 发生的情况不同。
同样getline 未能将字符串<space>dog 放入字符串s
它继续保留其原始值Mary。
我的问题如下。
某些
cin操作的失败是否要求全部失败 使用>>运算符或getline函数的后续cin操作。为什么第一次
cin操作失败会改变a的值 而b和s的初始值没有改变?
【问题讨论】:
-
将字符串输入读入 int 是错误的。检查
cin的状态,您会看到设置了失败标志。获取输入的正确方法是将所有内容作为字符串获取,然后尝试解析。另外,当你混合getline()和cin时要小心,因为cin将换行符留在缓冲区中,getline可能会错误地抓取。 -
这个问题只有一个有趣的地方:为什么
a变成0虽然输入失败了。 (由于失败状态,另一个被阻止) -
另外,看看this。也很有用。