如何读有空格的名字

How to read names with space?

本文关键字:空格 何读      更新时间:2023-10-16

如果我有这样的数据:

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;
}

然而,这不是很好,如果有人有一个中间名,例如?

用这些数据看第二个例子:

Michael Corleone
30
Tom Hagen
35

问题是,在用std::cin >> age读取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;
}

这个怎么样?

#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;
    }