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

C语言slice函数修改result数组长度后输出异常原因咨询

问题原因分析与修复方案

你的代码核心问题是没有给result字符串添加结束符'\0',C语言中puts()这类字符串输出函数要求输入必须是以'\0'结尾的合法C风格字符串,否则会持续读取内存中的随机垃圾数据,直到遇到某个'\0'为止,这就是你看到异常内容的原因。

具体细节拆解

  1. 原逻辑中,你要截取索引3到6的字符,一共是4个字符(索引3、4、5、6):
    • 当result长度设为3时,已经出现数组越界写入的问题(x会从0增长到4,需要至少5个空间:4个字符+1个结束符),只是偶尔栈上的巧合数据刚好让puts()提前遇到'\0',看似输出正常,但这是未定义行为,随时可能崩溃或输出异常。
    • 当result改为100/50时,数组中只有前4个位置被赋值,后面的96/46个位置都是未初始化的垃圾值,没有手动添加'\0',puts()就会把这些垃圾值一起输出,导致你看到的异常内容。

修复代码

只需要在循环结束后,给result添加结束符,同时保证result的长度足够容纳截取的字符+结束符:

#include <stdio.h>

void slice(char user_input[]);

int main(){
    char user_input[100];
    scanf("%s", user_input);

    slice(user_input);
}

void slice(char user_input[]){
    // 截取4个字符 + 1个结束符,至少需要5个空间
    char result[5];
    int n = 3, m = 6;
    int x = 0;

    for (int i = 0; user_input[i] != '\0'; i++)
    {
        if (i >= 3 && i <= 6)
        {
            result[x] = user_input[i];
            x++;
        }
    }
    // 必须添加字符串结束符
    result[x] = '\0';
    puts(result);   
}

额外优化建议

  • 可以通过m - n + 1计算需要截取的字符数量,动态确定result的大小,避免硬编码长度:
    int len = m - n + 1;
    char result[len + 1]; // +1 留位置给结束符
    
  • 如果输入字符串长度不足6,要处理边界情况,避免越界读取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 01:10:01