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

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规范,增加结果提示信息让输出更清晰。

原代码其他错误说明

  1. 原注释中的scanf("%s", &string1);写法错误:string1本身就是数组首地址,无需加&,正确写法为scanf("%s", string1);,但scanf无法读取带空格的字符串,因此还是fgets更适用。
  2. 原交换函数使用下标i虽能实现功能,但未充分利用指针特性,修改后直接操作指针更符合题目要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 01:15:31