在运行时对cin功能的困惑

时间:2019-02-12 03:27:23

标签: c++

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变量中。

2 个答案:

答案 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

肯定会工作。