如何用scanf直接拆分符合规则的连写姓名字符串为两个独立串
直接拆分含两个大写字母的连写姓名字符串
针对你的需求,不需要用strcat拼接,最直接的方式是定位第二个大写字母的位置,然后直接截取前后两部分,以下是具体实现:
核心思路
- 遍历字符串,找到第二个大写字母的索引(首字符已是第一个大写,从索引1开始查找)
- 以该索引为分界点,分别将前后两段字符复制到两个结果数组中
- 利用
snprintf控制复制长度,避免缓冲区溢出
代码示例
#include <stdio.h> #include <ctype.h> #include <string.h> int main() { char full_name[21] = "WillisBruce"; // 最长20字符,数组设为21留终止符位置 char first_name[21] = {0}; char last_name[21] = {0}; int split_index = -1; // 遍历查找第二个大写字母的位置 for (int i = 1; i < strlen(full_name); i++) { if (isupper((unsigned char)full_name[i])) { split_index = i; break; } } // 确认找到拆分点后执行截取 if (split_index != -1) { // 复制名字前缀:从开头到拆分点前一位 snprintf(first_name, split_index + 1, "%s", full_name); // 复制名字后缀:从拆分点到末尾 snprintf(last_name, sizeof(last_name), "%s", full_name + split_index); printf("First Name: %s\nLast Name: %s\n", first_name, last_name); } return 0; }
优势说明
- 完全避免拼接操作,直接通过索引定位拆分,逻辑清晰高效
- 用
snprintf替代strcpy,自动处理字符串终止符,同时限制复制长度,防止缓冲区溢出 - 适配所有符合规则的输入(首字符大写、两个大写不连续且非末尾)
内容的提问来源于stack exchange,提问作者ATpaul
相关产品推荐
相关产品推荐

