C语言中如何使用strcpy_s实现str1与str2字符串值的互换?
代码问题排查与修正
运行结果异常的根本原因
- 你现在的代码从头到尾只做了一件事:把str1的内容直接覆盖掉str2的原有值,完全没有修改str1本身的存储内容。所以运行完之后,str1还是你最开始输入的原值,str2被改成了和str1一样的内容,自然两个变量最终取值完全相同,从逻辑上就没实现“互换”的效果。
- 之前写两参数版本报“需要更多参数”是正常现象:
strcpy_s是VS专属的带边界校验的安全字符串函数,本身就要求必须传入3个参数,格式是strcpy_s(目标缓冲区, 目标缓冲区的总长度, 源字符串)。如果直接写标准C的strcpy(str2, str1),在VS默认的安全编译选项下还会触发警告,要求你替换成带边界检查的strcpy_s,这也是你之前会写两参数版本报错的常见原因。你现在补上长度参数之后编译不报错,只是因为你漏了交换流程的另外两步。
实现字符串互换的正确写法
C语言里的字符数组是不能直接用赋值语句互换的,必须和普通数值变量交换一样,靠临时缓冲区中转,不然直接覆盖会把原数据冲没:
- 建一块和原数组大小一样的临时字符数组
- 先把str2的原始内容存到临时数组里
- 把str1的内容拷贝到str2中
- 把临时数组里存的原str2内容拷贝回str1里
修正后的交换核心代码:
// 临时中转数组 char temp[100]; // 暂存原来的str2内容 strcpy_s(temp, sizeof(temp), str2); // 把str1的内容给到str2 strcpy_s(str2, sizeof(str2), str1); // 把暂存的原str2内容给到str1,完成互换 strcpy_s(str1, sizeof(str1), temp);
实用提示
- 写
strcpy_s的时候不要硬编码100当长度参数,直接用sizeof(目标数组)传长度,后续如果要调整数组大小,不用挨个改参数,能少出很多bug。
内容的提问来源于stack exchange,提问作者Kim ByeongHwa
相关产品推荐
相关产品推荐

