C++11中如何从字符串数组提取姓名的名、中间名与姓?
在C++11中提取全名的名、中间名和姓
嘿,刚从Python转C11确实会有点不习惯——毕竟Python的切片和split()太顺手了!不过你要的从全名数组里拆分出名、中间名、姓的需求完全可以实现,而且用C11的新特性还能写得挺简洁的。
核心思路
C标准库没有直接提供字符串拆分函数,但我们可以用std::istringstream来按空格分割字符串,再根据拆分后的部分数量分配到对应的字段里。同时我们可以用C11的auto、范围for循环这些特性让代码更简洁。
完整实现代码
首先定义一个结构体来存储拆分后的名字部分,这样逻辑更清晰:
#include <iostream> #include <vector> #include <sstream> #include <string> // 存储拆分后的名字组件 struct NameParts { std::string first; std::string middle; std::string last; };
接下来写一个解析单个全名的函数,负责拆分和分配字段:
// 解析单个全名,返回拆分后的结果 NameParts parseFullName(const std::string& fullName) { std::istringstream nameStream(fullName); std::vector<std::string> nameParts; std::string part; // 用istringstream按空格分割所有名字部分(自动跳过多余空格) while (nameStream >> part) { nameParts.push_back(part); } NameParts result; if (nameParts.size() == 2) { // 只有名和姓,中间名留空 result.first = nameParts[0]; result.last = nameParts[1]; } else if (nameParts.size() >= 3) { // 第一个元素是名,最后一个是姓,中间所有元素拼接为中间名 result.first = nameParts[0]; result.last = nameParts.back(); // C++11新增的vector末尾元素访问方法 for (size_t i = 1; i < nameParts.size() - 1; ++i) { if (i != 1) { result.middle += " "; // 处理中间名有多个词的情况 } result.middle += nameParts[i]; } } else if (nameParts.size() == 1) { // 处理只有单个名字的边界情况 result.first = nameParts[0]; } return result; }
最后在主函数里用C++11的范围for循环遍历你的名字数组,调用解析函数:
int main() { // 你的全名数组 std::vector<std::string> fullNames = {"John Doe", "Bill Gates", "Tyler Maxwell Gordon"}; // C++11范围for循环,简化遍历 for (const auto& fullName : fullNames) { auto parts = parseFullName(fullName); // auto自动推导类型,不用手动写NameParts std::cout << "名: " << parts.first << " | 中间名: '" << parts.middle << "'" << " | 姓: " << parts.last << "\n"; } return 0; }
运行结果
执行这段代码后,你会得到如下输出:
名: John | 中间名: '' | 姓: Doe 名: Bill | 中间名: '' | 姓: Gates 名: Tyler | 中间名: 'Maxwell' | 姓: Gordon
关于C++11特性的说明
这里用到的几个关键特性都是C++11新增的:
auto:自动推导变量类型,减少冗余代码- 范围for循环:简化容器的遍历,不用手动写迭代器
std::vector::back():直接访问容器的最后一个元素,比nameParts[nameParts.size()-1]更直观
虽然不像Python那样一行切片就能搞定,但逻辑清晰,完全能满足你的需求,而且也符合C++11的使用习惯。
内容的提问来源于stack exchange,提问作者Currently Victor
相关产品推荐
相关产品推荐

