You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 03:27:46