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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 10:12:47