如何在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
相关产品推荐
相关产品推荐

