如何用空格读取名字?

时间:2016-10-05 18:51:24

标签: c++ input

如果我的数据如下所示:

Michael 30
Tom 35

我可以通过以下代码处理它:

#include <iostream>
#include <string>
int main()  {
    std::string name;
    int age;
    while(std::cin >> name >> age)  {
        std::cout << name << " is " << age << " years old." << std::endl;
    }
    return 0;
}

但是,如果我的数据如下:

Michael Corleone
30
Tom Hagen
35

我尝试使用此代码,但它只读取第一行,逻辑似乎应该读取所​​有行,所以我不知道为什么这次尝试失败。

#include <iostream>
#include <string>
int main()  {
    std::string name;
    int age;
    while(std::getline(std::cin, name) && std::cin >> age)  {
        std::cout << name << " is " << age << " years old." << std::endl;
    }
    return 0;
}

更糟糕的是,如果我的数据如下所示:

Michael Corleone 30
Tom Hagen 35

按照其中一个答案的建议,我可以通过将名称分为name1name2来解决方法:

int main()  {
    std::string name1, name2;
    int age;
    while(std::cin >> name1 >> name2 >> age)  {
        std::cout << name1 + ' ' + name2 
            << " is " << age << " years old." << std::endl;
    }
    return 0;
}

然而,这不好,如果某人有中间名怎么办?

2 个答案:

答案 0 :(得分:3)

查看这个数据的第二个例子:

Michael Corleone
30
Tom Hagen
35

问题是,在用age阅读std::cin >> age之后,行尾字符仍留在流中,因此以下std::getline没有任何结果,因为它认为该行是空的(它是)。

诀窍是在读取每条新记录之前跳过空格:

std::string name;
int age;
while(std::cin >> std::ws && std::getline(std::cin, name) && std::cin >> age) {
    std::cout << name << " is " << age << " years old." << std::endl;
}

或者,更简洁:

std::string name;
int age;
while(std::getline(std::cin >> std::ws, name) >> age) {
    std::cout << name << " is " << age << " years old." << std::endl;
}

答案 1 :(得分:-3)

这个怎么样?

#include <iostream>
#include <string>
    int main()  {
        std::string firstname;
        std::string lastname;
        int age;
        while(true){
          std::cin >> firstname;
          std::cin >> lastname;
          std::cin >> age);
          std::cout << firstname << " " << lastname << " is " << age << " years old." << std::endl;
        }
        return 0;
    }