C语言不使用strcpy()实现两字符串互换拷贝的代码修复求助
问题修复:两个字符串交换拷贝(指针+while循环实现)
原代码运行无输出的核心原因是野指针非法访问内存,同时还有函数安全性、指针使用不规范等问题,以下是修复后的完整代码及说明:
修复后的完整代码
#include <stdio.h> void string_copier(char *a, char *b, char *swap); int main(){ char string1[100], string2[100]; char swap[100]; // 分配合法内存存储临时字符串,替代野指针 /* 读取字符串,替换不安全的gets函数 */ printf("Enter a string less than 100 characters:\n"); fgets(string1, sizeof(string1), stdin); // 去除fgets读取的换行符 char *newline = string1; while(*newline != '\n' && *newline != '\0') newline++; if(*newline == '\n') *newline = '\0'; printf("Enter another string less than 100 characters:\n"); fgets(string2, sizeof(string2), stdin); newline = string2; while(*newline != '\n' && *newline != '\0') newline++; if(*newline == '\n') *newline = '\0'; /* 调用交换拷贝函数 */ string_copier(string1, string2, swap); /* 输出交换后的结果 */ printf("After swap:\n"); printf("string1: %s\n", string1); printf("string2: %s\n", string2); return 0; } void string_copier(char *a, char *b, char *swap){ // 直接用指针遍历,贴合题目"使用指针"的要求 char *p_a = a, *p_swap = swap; // 把a的内容拷贝到swap while(*p_a != '\0'){ *p_swap = *p_a; p_a++; p_swap++; } *p_swap = '\0'; // 手动添加字符串结束符 // 把b的内容拷贝到a char *p_b = b; p_a = a; while(*p_b != '\0'){ *p_a = *p_b; p_a++; p_b++; } *p_a = '\0'; // 把swap的内容拷贝到b p_swap = swap; p_b = b; while(*p_swap != '\0'){ *p_b = *p_swap; p_b++; p_swap++; } *p_b = '\0'; }
关键修改点
- 解决野指针问题:原代码中
char *swap;是未初始化的野指针,直接赋值会触发内存访问错误导致程序崩溃。修改为在main中声明char swap[100];,提供合法的内存空间存储临时字符串,并作为参数传入交换函数。 - 替换不安全函数:
gets函数存在缓冲区溢出风险,已被C标准废弃,改用fgets读取字符串,并手动去除fgets附带的换行符,避免字符串包含多余换行。 - 优化指针操作:去掉原代码中的下标
i,直接通过移动指针变量遍历字符串,完全贴合题目"使用指针"的要求。 - 完善程序规范:给
main函数添加return 0;符合标准C规范,增加结果提示信息让输出更清晰。
原代码其他错误说明
- 原注释中的
scanf("%s", &string1);写法错误:string1本身就是数组首地址,无需加&,正确写法为scanf("%s", string1);,但scanf无法读取带空格的字符串,因此还是fgets更适用。 - 原交换函数使用下标
i虽能实现功能,但未充分利用指针特性,修改后直接操作指针更符合题目要求。
内容的提问来源于stack exchange,提问作者not_castillo
相关产品推荐
相关产品推荐

