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

C语言字符串操作异常:输出乱码t§■a而非预期内容求助

问题分析与修复

核心问题

  1. 数组越界引发内存溢出:你定义的s1是固定长度字符数组,初始内容"once upon a "的长度(含终止符)已占满数组空间,用strcat追加s2会直接越界写入非法内存,这就是乱码t§■a的根源。
  2. 操作逻辑完全偏离需求:你要把s2插入到s1中"a"的前方,但代码用strcat直接追加到末尾,完全不符合插入逻辑;另外strcpy(s1, s1)是毫无意义的冗余操作。

修复后的代码

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

int main(){
    // 定义足够大的数组,避免越界
    char s1[100] = "once upon a";
    char s2[] = "time ";
    char *a_pos = strstr(s1, "a"); // 定位s1中"a"的位置

    if (a_pos != NULL) {
        // 把"a"及后续内容后移,留出s2的插入空间
        memmove(a_pos + strlen(s2), a_pos, strlen(a_pos) + 1);
        // 将s2复制到空出的位置
        strncpy(a_pos, s2, strlen(s2));
    }

    puts(s1); // 输出插入后的完整字符串:once upon time a

    // 打印"a"之后的内容
    a_pos = strstr(s1, "a");
    if (a_pos != NULL) {
        printf("%s\n", a_pos + 1); // 跳过"a"字符,打印后续内容
    }

    return 0;
}

关键说明

  • 把s1定义为char s1[100],预留足够空间存放插入后的字符串,彻底解决越界问题。
  • 用strstr定位"a"的位置,通过memmove(内存区域重叠时不能用memcpy)将"a"及后续内容后移,再用strncpy把s2插入到空出的位置。
  • 打印"a"之后的内容时,找到"a"的指针后,直接取a_pos + 1即可跳过"a"字符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:01:34