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

C语言多函数字符串拼接程序异常:乱码+变量值丢失求助

问题分析与修复方案

核心问题1:值传递无法修改外部变量

你在entstr1和entstr2中传递long1、long2时用的是值传递,子函数里修改的只是局部变量的副本,根本不会影响全局的long1和long2。所以回到main后这两个值还是初始的0。

解决办法:要么用指针传递长度变量,要么让子函数直接返回字符串长度。

核心问题2:fgets的缓冲区大小计算错误

在子函数里,str1是指针类型,sizeof str1得到的是指针本身的大小(32位系统是4字节,64位是8字节),不是你在main里定义的数组大小(7字节)。这会导致fgets只能读取很少的字符,甚至截断输入。

解决办法:把数组的大小作为参数传递给子函数。

其他问题

  • fflush(stdin)是标准C未定义的行为,不能用来清空输入缓冲区,会导致跨平台问题。
  • plustr函数的循环逻辑完全错误,索引越界,而且拼接后没有添加字符串终止符'\0',导致输出乱码。
  • 滥用全局变量,增加了代码耦合性,容易出问题。

修复后的完整代码

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

// 子函数返回字符串长度,同时接收数组大小参数
int entstr1(char *str1, int max_len);
int entstr2(char *str2, int max_len);
void plustr(char* str1, char* str2, char* rstr, int len1, int len2);

int main(void) {
    char str1[7], str2[7], rstr[14];
    int long1, long2, longall;

    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);

    // 传递数组大小,接收返回的长度
    long1 = entstr1(str1, sizeof(str1));
    long2 = entstr2(str2, sizeof(str2));

    printf("输入的字符串1:%s", str1);
    printf("输入的字符串2:%s", str2);

    longall = long1 + long2;
    printf("\n总长度:%d\n", longall);

    plustr(str1, str2, rstr, long1, long2);
    printf("拼接结果:%s\n", rstr);

    return 0;
}

int entstr1(char *str1, int max_len) {
    printf("请输入第1行:");
    fgets(str1, max_len, stdin);
    
    // 处理fgets读取的换行符,同时计算有效长度
    int len = strlen(str1);
    if (len > 0 && str1[len-1] == '\n') {
        str1[len-1] = '\0';
        len--;
    } else {
        // 清空输入缓冲区中多余的字符
        int c;
        while ((c = getchar()) != '\n' && c != EOF);
    }
    
    printf("第1行长度:%d\n", len);
    return len;
}

int entstr2(char* str2, int max_len) {
    printf("请输入第2行:");
    fgets(str2, max_len, stdin);
    
    int len = strlen(str2);
    if (len > 0 && str2[len-1] == '\n') {
        str2[len-1] = '\0';
        len--;
    } else {
        int c;
        while ((c = getchar()) != '\n' && c != EOF);
    }
    
    printf("第2行长度:%d\n", len);
    return len;
}

void plustr(char* str1, char* str2, char* rstr, int len1, int len2) {
    // 先复制str1到结果
    strcpy(rstr, str1);
    // 再拼接str2
    strcat(rstr, str2);
    // 或者手动实现拼接:
    // int i;
    // for (i = 0; i < len1; i++) {
    //     rstr[i] = str1[i];
    // }
    // for (int j = 0; j < len2; j++, i++) {
    //     rstr[i] = str2[j];
    // }
    // rstr[i] = '\0'; // 必须添加终止符
}

修复说明

  1. 参数传递优化:子函数返回字符串长度,同时接收数组最大长度,避免值传递的问题。
  2. 输入处理优化:去掉fflush(stdin),改用合法的方式清空输入缓冲区,同时处理fgets读取的换行符,避免结果里带换行。
  3. 拼接函数修复:直接用标准库的strcpy和strcat实现拼接(或者手动实现时注意添加终止符),避免索引错误。
  4. 减少全局变量:把所有变量改为局部变量,降低代码耦合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 16:27:36