C程序中strtok()函数无法正常工作的问题排查
strtok()重复返回第一个令牌的问题修复
你的代码核心错误在于后续调用strtok()时重复传入了原始字符串inString,这完全违背了strtok()的工作逻辑。
strtok()是一个维护内部状态的函数:
- 第一次调用时,传入目标字符串,它会定位到第一个非分隔符字符,分割出第一个令牌,同时在内部保存当前处理的位置。
- 后续要继续分割同一个字符串时,必须传入
NULL,这样它才会从上次保存的位置继续查找下一个令牌。
如果每次调用都传入原始字符串inString,它会每次都从字符串起始位置重新分割,自然只会反复返回第一个单词。
修正后的makeWordList()函数如下:
// Assumes a multi-word string was entered. void makeWordList(char inString[], unsigned int wordCount, char * wordList[]) // Separate out words. { unsigned int index = 0; const char * delimiter = " "; char * word; word = strtok(inString, delimiter); // Get first word. while ((word != NULL) && (index < wordCount)) { wordList[index++] = word; // Add word to list. word = strtok(NULL, delimiter); // 传入NULL,继续分割剩余字符串 } // end while() }
额外提醒两点:
- strtok()会直接修改原始字符串(用
\0替换分隔符),如果后续还需要使用未分割的原字符串,记得提前备份。 - 当前使用的分隔符
" "会自动跳过连续的空格,若需要处理更复杂的分隔符(比如制表符、换行符),可以把分隔符字符串改成" \t\n"。
内容的提问来源于stack exchange,提问作者Stuart
相关产品推荐
相关产品推荐

