C语言提取姓名数组的姓氏存入二维字符数组失败怎么解决
问题排查与修复方案
错误点梳理
- 变量名笔误:全局姓名数组定义时命名为
ame,后续strrchr调用时用了name[i],标识符不匹配,会触发编译报错 - 数组越界风险:原姓名数组仅初始化了3个元素,循环条件写为
i<4会访问未初始化的内存,存在运行异常风险,需改为i<3 - 字符数组赋值逻辑错误:
surname是预先分配了内存的二维字符数组,C语言不支持直接用=给数组赋值指针地址,需要调用strcpy函数将last+1指向的姓氏字符串拷贝到surname[i]对应的内存空间中
修复后可运行代码
#include <stdio.h> #include <string.h> // 修正数组命名为name char name[100][100] = {"Charles Thompson","Andy Hardy","Christopher de Charls-morson"}; char surname[100][100]; int main(void) { // 修正循环边界为3 for(int i=0;i<3;i++){ char *last = strrchr(name[i], ' '); if (last != NULL) { printf("Last token: '%s'\n", last+1); // 用strcpy完成字符串拷贝 strcpy(surname[i], last+1); } } // 测试输出 for(int k=0;k<3;k++){ printf("%s\n", surname[k]); } return 0; }
效果说明
代码运行后surname数组的存储内容完全符合需求:surname[0]存Thompson、surname[1]存Hardy、surname[2]存Charls-morson,后续做姓氏匹配查找时可以直接用strcmp函数对比输入字符串和surname数组的元素即可。
内容的提问来源于stack exchange,提问作者D. K.
相关产品推荐
相关产品推荐

