C语言:void函数交换姓名字符串中名与姓位置失效求助
解决void函数交换字符串中名和姓的问题
我明白你现在的困扰——想用void函数交换字符串里的名和姓,但全局数组始终没被正确修改。我先给你一个能正常工作的完整实现,再拆解可能导致你代码失效的常见问题,帮你排查。
可运行的代码实现
#include <stdio.h> #include <string.h> // 全局数组存储待交换的姓名 char name[50]; void swapFirstNameLastName() { // 第一步:定位字符串中的空格(分隔名和姓的标志) char* spaceMarker = strchr(name, ' '); if (spaceMarker == NULL) { // 没有找到空格,直接返回(避免后续越界操作) return; } // 第二步:把名和姓分别提取到临时数组 // 提取名:从开头到空格前的部分 char firstName[25]; strncpy(firstName, name, spaceMarker - name); firstName[spaceMarker - name] = '\0'; // 手动添加字符串结束符,避免垃圾数据 // 提取姓:从空格后的第一个字符到结尾 char lastName[25]; strcpy(lastName, spaceMarker + 1); // 第三步:把姓+空格+名拼接回全局数组 strcpy(name, lastName); strcat(name, " "); strcat(name, firstName); } int main() { strcpy(name, "John Smith"); printf("交换前:%s\n", name); swapFirstNameLastName(); printf("交换后:%s\n", name); return 0; }
你代码可能失效的常见原因
我帮你梳理几个最容易踩的坑,你可以对照自己的代码排查:
- 坑1:没真正操作全局数组
如果你在void函数里定义了局部数组,或者函数参数用了char str[]但调用时传了其他局部变量,那你的操作根本没触碰到全局的name数组,自然看不到修改效果。一定要确保函数直接对全局的name进行读写。 - 坑2:字符串没加结束符
\0
用strncpy提取子串时,它不会自动添加结束符。如果没手动加\0,后续的strcat或printf会读到内存里的垃圾数据,甚至破坏全局数组的内容。 - 坑3:直接在原数组上修改导致数据丢失
如果没先把名和姓存到临时数组,直接在全局数组上覆盖内容,比如先把姓写到数组开头,那原来的名就被覆盖了,后续根本没法提取拼接。 - 坑4:没处理无空格的异常情况
如果输入字符串没有空格(比如只有名字没有姓),strchr会返回NULL,这时候继续操作指针会导致内存越界,可能把全局数组搞成乱码,甚至程序崩溃。
你可以对照这几点检查自己的代码,应该就能找到问题所在啦。
内容的提问来源于stack exchange,提问作者Jozko
相关产品推荐
相关产品推荐

