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

如何在C语言自定义函数中使用strcpy()实现字符串交换且不修改main函数

核心问题排查

  • 你传入swap_char函数的参数是字符串字面值,C标准规定这类双引号直接定义的字符串存储在只读内存段,禁止修改,你用strcpy向这类地址写入数据会直接触发段错误,导致程序崩溃。
  • 你的swap_char函数声明了返回char类型,但函数内没有return语句,存在语法不规范问题,编译会报警告。

解决方案

方案1:不修改main函数,仅保证swap_char内部输出交换结果(满足你的要求)

因为你的原代码逻辑是在swap_char内部打印交换前后的结果,不需要main感知交换结果,调整后的实现如下:

#include <stdio.h>
#include <string.h>

// 无返回值声明为void
void swap_char(char *s1, char *s2) {
    printf("before swapping : swap_char(\"%s\", \"%s\")\n", s1, s2);

    // 用静态可写数组缓存两个字符串,避免操作只读内存
    static char buf1[50], buf2[50], temp[50];
    strcpy(buf1, s1);
    strcpy(buf2, s2);
    
    // 仅用strcpy完成交换逻辑
    strcpy(temp, buf1);
    strcpy(buf1, buf2);
    strcpy(buf2, temp);
    
    printf("After swapping : swap_char(\"%s\", \"%s\")\n", buf1, buf2);
}

int main() {
    swap_char("please","work");
    return 0;
}

运行后输出符合预期:

before swapping : swap_char("please", "work")
After swapping : swap_char("work", "please")

方案2:需要main函数感知交换结果(需调整main的字符串定义方式)

如果要让main侧也能拿到交换后的字符串,必须把字符串存储在可写的栈/堆内存中,不能直接用字符串字面值传参,实现如下:

#include <stdio.h>
#include <string.h>

void swap_char(char *s1, char *s2) {
    char temp[50];
    strcpy(temp, s1);
    strcpy(s1, s2);
    strcpy(s2, temp);
}

int main() {
    // 定义可写的字符数组存储字符串,而非直接使用字面值
    char str1[50] = "please";
    char str2[50] = "work";
    swap_char(str1, str2);
    printf("swap result in main: %s %s", str1, str2);
    return 0;
}

关键规则提醒

C语言中直接用双引号定义的字符串属于只读常量,任何写入操作都是未定义行为,如果你需要修改字符串内容,必须将其拷贝到可写的内存区域(栈数组、动态申请的堆内存等)。

内容的提问来源于stack exchange,提问作者braindamage

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:06:04