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

自制C语言slice函数部分切片出现异常值问题排查

问题原因及修复方案

核心问题

C语言的字符串必须以**空字符'\0'**作为结束标志,puts()函数会持续输出直到遇到该标志才停止。你的代码存在两个关键问题:

  • 定义的new[b - a]数组长度刚好等于截取的字符数,没有预留存储结束符的空间
  • 循环仅复制了b-a个字符,未在数组末尾添加'\0'

当传入参数(0,15)时,new数组被填满后没有结束符,puts()会继续读取数组后方的随机内存数据,因此出现异常值。其他参数看似正常只是巧合——那些场景下new数组后的内存恰好存在'\0',属于未定义行为,完全不可靠。

修复后的代码

#include<stdio.h>

void slice(int a, int b, char *str) {
    // 多分配1个字节用于存储字符串结束符
    char new[b - a + 1];

    for (int i = 0; i < b - a; i++) {
        new[i] = str[a + i];
    }
    // 手动添加字符串结束标志
    new[b - a] = '\0';

    puts(new);
}

int main() {
    char str[] = "My name is Ayush Anand";
    slice(0, 15, str);
    
    return 0;
}

额外优化提示

char str[] = { "My name is Ayush Anand" };可以简化为char str[] = "My name is Ayush Anand";,两者效果完全一致,写法更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:40:42