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

C语言字符数组输出多余字符求助:HELLO转HLOEL失败

问题根源:C字符串缺少终止符导致输出越界

你的程序输出异常的核心原因是C语言中使用printf("%s")输出字符串时,要求字符串必须以空字符'\0'结尾,而你定义的hi和lo数组没有预留空间存放这个终止符,导致printf读取内存时越界,直到碰到内存中随机的'\0'才停止,所以出现了多余的内容。

具体分析

  • 你定义的hi[3]用来存储偶数索引的字符(H、L、O),刚好占满3个元素的空间,没有多余位置放'\0';
  • lo[2]存储奇数索引的字符(E、L),同样占满全部空间,也没有'\0';
  • 当printf("%s%s", hi, lo)执行时,先读取hi数组,因为没有终止符,会继续读取后续的lo数组内容,之后还会读取内存中其他无关数据,直到遇到第一个'\0',最终输出了多余的"HLO"。

修复方案

方案1:给数组预留终止符空间并手动添加

修改数组定义,多分配一个元素的空间,然后在循环结束后添加字符串终止符:

#include <stdio.h>

int main() {
    int i, loPos=0, hiPos=0;
    char *str="HELLO";
    char lo[3]; // 原2,+1用于存'\0'
    char hi[4]; // 原3,+1用于存'\0'
    for(i=0;i<5;i++)
    {
        if(i%2==0)
        {
            hi[hiPos++]=str[i];
        }
        else
        {
            lo[loPos++]=str[i];
        }
    }
    hi[hiPos] = '\0'; // 添加字符串终止符
    lo[loPos] = '\0'; // 添加字符串终止符
    printf("%s%s",hi,lo);
    return 0;
}

方案2:逐个输出字符,不依赖字符串终止符

如果不想修改数组大小,可以直接逐个输出数组中的字符,避免printf的字符串越界读取:

#include <stdio.h>

int main() {
    int i, loPos=0, hiPos=0;
    char *str="HELLO";
    char lo[2];
    char hi[3];
    for(i=0;i<5;i++)
    {
        if(i%2==0)
        {
            hi[hiPos++]=str[i];
        }
        else
        {
            lo[loPos++]=str[i];
        }
    }
    // 逐个输出hi的字符
    for(int j=0; j<hiPos; j++) {
        printf("%c", hi[j]);
    }
    // 逐个输出lo的字符
    for(int j=0; j<loPos; j++) {
        printf("%c", lo[j]);
    }
    printf("\n");
    return 0;
}

两种方案都能输出预期的HLOEL。

内容的提问来源于stack exchange,提问作者Vikneysh Raj G G A

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 00:46:03