C语言中strtok的正确用法及拼接代码报错问题如何解决?
问题分析
- strtok使用逻辑错误:strtok分割字符串的规则是首次调用传入目标字符串指针,后续迭代分割剩余内容需传入
NULL作为第一个参数。你在循环内每次都传入原始str指针,导致每次都从头分割,永远只能拿到第一个单词,同时触发死循环。 - addTo初始状态判断错误:代码中
if (addTo==" ")是指针地址比较,你初始分配的bigStr是malloc得到的1字节空间(正常应该初始化为'\0',代表空字符串),和常量字符串" "的地址永远不可能相等,该分支永远不会触发,且判断逻辑完全不符合你的初始状态预期。 - 循环条件错误:
while (str != NULL)的判断无意义,str作为传入参数不会在循环内被修改,会直接触发死循环。 - 内存与字符串操作隐患:首次malloc后未对
addTo做初始化置'\0'操作,直接调用strcat会访问非法内存;长度计算未预留字符串结尾'\0'的空间,存在缓冲区溢出风险;末尾多余#的处理逻辑混乱,realloc缩容后未手动补充'\0'。
修复方案
首先要求你在初始化bigStr时必须补全初始化操作:char* bigStr = (char*)malloc(sizeof(char)*1); *bigStr = '\0';,保证初始为空字符串。
修复后的完整代码如下:
#include <string.h> #include <stdlib.h> char* addToStr(char* addTo, char* str,int on) { if (str == NULL || addTo == NULL) { return addTo; } // 首次分割传原字符串,后续分割传NULL char* temp = strtok(str, " "); while (temp != NULL) { // 计算扩容长度:原有长度 + 当前单词长度 + 新增# + 结尾'\0' int newlength = strlen(addTo) + strlen(temp) + 2; addTo = (char*)realloc(addTo, newlength); // 追加单词和分隔符# strcat(addTo, temp); strcat(addTo, "#"); // 取下一个单词 temp = strtok(NULL, " "); } int current_len = strlen(addTo); if(on) { // 把末尾多余的#替换成@ addTo[current_len - 1] = '@'; } else { // 删除末尾多余的#,置结束符 addTo[current_len - 1] = '\0'; // 可选缩容,不影响功能 addTo = (char*)realloc(addTo, current_len); } return addTo; }
内容的提问来源于stack exchange,提问作者יונתן אליהו
相关产品推荐
相关产品推荐

