strtok()在WSL Ubuntu正常运行,Windows Mingw32下失效求助
strtok在MinGW32下首次调用返回NULL的问题解决
问题场景
- 以下代码在WSL Ubuntu环境运行正常,但在Windows MinGW32环境中出现异常
- 分隔符设置为
(char)32(空格字符) - 调试确认
line变量已正确读取包含空格的内容,但strtok(line, &delim)首次调用返回NULL
原代码
while (!feof(f)){ if(!fgets(line, LINE_LEN, f) || !*line || !strcmp(line, "\n")) continue; word = strtok(line, &delim); printf("xd\n"); while(word){ //printf("%s\n",word);s add_item(h,word); word = strtok(NULL, &delim); wc++; } lc++; }
问题原因
strtok的第二个参数要求是以'\0'结尾的字符串指针,原代码中传递的&delim指向单个char变量(值为32),该变量后续内存内容未定义,并非'\0'。
- Ubuntu的glibc库实现中,
delim后的内存恰好为0,因此能正常识别空格作为分隔符 - MinGW32使用的msvcrt库中,
delim后的内存不是0,导致strtok将一堆未知字符视为分隔符,最终返回NULL
解决方案
直接使用以'\0'结尾的字符串作为分隔符,三种可行方式:
- 定义分隔符字符串:
char delim[] = " ";,调用时传delim - 构造带终止符的字符数组:
char delim[2] = {(char)32, '\0'}; - 最简洁方式:直接传递字符串字面量
" "
修改后的代码示例
// 假设LINE_LEN已提前定义 while (!feof(f)){ if(!fgets(line, LINE_LEN, f) || !*line || !strcmp(line, "\n")) continue; word = strtok(line, " "); // 使用空格字符串作为分隔符 printf("xd\n"); while(word){ //printf("%s\n",word); add_item(h,word); word = strtok(NULL, " "); wc++; } lc++; }
内容的提问来源于stack exchange,提问作者vatr
相关产品推荐
相关产品推荐

