C语言无<string.h>拼接字符串异常,数字串场景求助
问题排查与修正
你的代码存在三个关键问题,导致无法正确拼接字符串:
1. 循环终止条件不完整
第二个循环仅判断str2[j] != '\n',当输入的字符串刚好填满缓冲区(比如你的测试用例输入10个字符),fgets不会存储换行符'\n',此时循环会一直执行,越界访问内存,引发未定义行为,无法正确终止。
需要同时判断字符串结束符'\0',确保遍历到字符串末尾就停止。
2. 拼接索引计算冗余且易出错
第二个循环中使用new_str[i+j]作为目标索引是多余的——i已经记录了第一个字符串的长度,直接用i来跟踪目标数组的当前位置,每次赋值后递增i即可,逻辑更清晰且不易出错。
3. 未处理fgets读取的换行符(潜在问题)
如果输入的字符串长度小于缓冲区大小,fgets会将换行符'\n'存入字符串,原代码的第一个循环会跳过该字符,导致拼接结果丢失换行符。若需要保留输入的完整内容,应该先将换行符替换为'\0',再进行拼接。
修正后的代码
#include <stdio.h> int main() { char str1[11], str2[11], new_str[21]; fgets(str1, sizeof(str1), stdin); fgets(str2, sizeof(str2), stdin); // 处理str1中的换行符(如果存在) int i = 0; while (str1[i] != '\n' && str1[i] != '\0') { i++; } if (str1[i] == '\n') { str1[i] = '\0'; } // 处理str2中的换行符(如果存在) int j = 0; while (str2[j] != '\n' && str2[j] != '\0') { j++; } if (str2[j] == '\n') { str2[j] = '\0'; } // 拼接str1到new_str i = 0; while (str1[i] != '\0') { new_str[i] = str1[i]; i++; } // 拼接str2到new_str j = 0; while (str2[j] != '\0') { new_str[i] = str2[j]; i++; j++; } new_str[i] = '\0'; printf("%s", new_str); return 0; }
代码说明
- 先单独处理两个输入字符串中的换行符,将其替换为
'\0',确保输入的字符串是标准的C风格字符串。 - 拼接时分别遍历两个字符串到末尾(以
'\0'为终止条件),保证不会越界。 - 目标数组
new_str的索引通过i递增来跟踪,逻辑清晰,避免计算错误。
测试你的输入abcdefghij和0123456789时,会正确输出abcdefghij0123456789。
内容的提问来源于stack exchange,提问作者NIRAY
相关产品推荐
相关产品推荐

