C语言slice函数修改result数组长度后输出异常原因咨询
问题原因分析与修复方案
你的代码核心问题是没有给result字符串添加结束符'\0',C语言中puts()这类字符串输出函数要求输入必须是以'\0'结尾的合法C风格字符串,否则会持续读取内存中的随机垃圾数据,直到遇到某个'\0'为止,这就是你看到异常内容的原因。
具体细节拆解
- 原逻辑中,你要截取索引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
相关产品推荐
相关产品推荐

