int main()
{
cout<< "Please enter your first name (followed by 'enter'):\n";
string first_name; // first_name is a variable of type String
cin >> first_name; // read characters into first_name
cout<<"Hello, " <<first_name<<"!\n";
cout<<" first_name "<<" is "<< first_name <<"\n";
cout << "Please enter you first name and age\n";
string new_first_name = "unentered";
int age = -1;
cin >> new_first_name;
cin >> age;
cout << "Hello, " << new_first_name << "(age " << age << ") \n";
return 0;
}
我有上面的代码,基本上是我正在研究的书中的一个示例。
当我编译并运行我不了解的东西时,会发生一些相当有趣的事情。在第一个提示下,如果我输入一个名字说“ Joe”,那么程序的其余部分都可以正常工作。也就是说,我可以在第二个提示符下输入新名称“ George”和年龄“ 23”,输出就可以了。
另一方面,如果我在第一个提示中输入两个用逗号隔开的单词,说“ Joe Person”,然后在第二个提示中输入George 23,则得到输出Person(年龄0)。 / p>
因此,似乎使用了第二个名称,在第二个字符串提示符中使用了该名称,然后对age输入进行了一些操作。我很惊讶它没有输出初始化值-1。
有人可以告诉我这里会发生什么吗?我本以为对于第一个提示,该程序将忽略第一个空格之后出现的所有内容,但它看起来好像是以某种方式存储之后又存储在new_first_name变量中。
答案 0 :(得分:5)
C ++流提取用于字符串read tokens的运算符。这就是下一个空白。
通常cpp-reference是C / C ++的不错参考。
答案 1 :(得分:4)
当输入可以包含空格时,使用getline
函数以std::string
数据类型获取输入。
您可以这样写:getline(cin,first_name);
它将正常工作。
如果您改用cin
,则它将在出现第一个空格后忽略输入的字符串。例如,如果您输入'Joe Person',则cin
仅将'Joe'存储在first_name变量中。还将保留“ Person”作为下一个要阅读的内容。
仅当输入字符串不包含空格时,才应将cin
与std :: string一起使用,如果包含空格,则应使用getline()
,此功能在{{1 }}出于相同的目的。
找到完整的说明here
肯定会工作。