You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:35:41