自制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
相关产品推荐
相关产品推荐

