gpt4 book ai didi

c++ - 如何读带空格的名字?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:45:21 31 4
gpt4 key购买 nike

如果我有这样的数据:

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

关于c++ - 如何读带空格的名字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39881604/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com