使用C语言strsep函数分割字符串时首元素输出异常,求解答
问题原因:缓冲区溢出导致字符串未正确终止
你的问题核心是数组元素长度不足,引发缓冲区溢出,破坏了字符串的终止规则,具体拆解如下:
- 第一个待分割的token是
" teste-13-f8-04",包含开头空格在内一共15个可见字符,但C语言字符串必须以'\0'作为结束标志,这意味着存储该字符串至少需要16字节的空间。 - 你定义的
AllHostName[32][15]每个元素仅分配了15字节,当用strcpy复制15个字符的token时,没有多余空间存放'\0',导致AllHostName[0]成为没有终止符的“非法字符串”。 - 溢出的内容会覆盖相邻的
AllHostName[1]起始位置,当printf打印AllHostName[0]时,会持续读取内存直到遇到'\0',因此会把AllHostName[1]的内容也一并输出,最终出现teste-13-f8-04teste-13-fd-80这种拼接结果。
修复方案
方案1:扩大目标数组的元素长度
直接调整AllHostName的定义,确保每个元素能容纳最长的token加上终止符:
char AllHostName[32][16]; // 或设置为20等更大值,留足余量
方案2:使用安全的字符串复制函数
如果不想调整数组长度,改用strncpy并手动添加终止符,避免溢出风险:
// 在splitStrings函数的循环中替换strcpy为: strncpy(variable[i], token, 14); // 仅复制14个字符,预留1个位置给'\0' variable[i][14] = '\0'; // 手动添加字符串终止符
内容的提问来源于stack exchange,提问作者Termanly
相关产品推荐
相关产品推荐

