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'; // 必须添加终止符 }
修复说明
- 参数传递优化:子函数返回字符串长度,同时接收数组最大长度,避免值传递的问题。
- 输入处理优化:去掉
fflush(stdin),改用合法的方式清空输入缓冲区,同时处理fgets读取的换行符,避免结果里带换行。 - 拼接函数修复:直接用标准库的
strcpy和strcat实现拼接(或者手动实现时注意添加终止符),避免索引错误。 - 减少全局变量:把所有变量改为局部变量,降低代码耦合。
内容的提问来源于stack exchange,提问作者Egor Egor
相关产品推荐
相关产品推荐

