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

C语言switch语句中使用strtok分割字符串仅输出首个单词的问题

问题分析与解决

你的代码核心问题出在case 'l'分支的while循环里:

while (token != NULL) {
    printf("%s\n", token);
    token = strtok(NULL, " ");
    break; // 这个break直接终止了while循环
}

这条多余的break语句会在第一次循环执行后立刻跳出while循环,导致strtok没有机会继续解析后续的单词,所以只能输出第一个结果。而你在switch外使用strtok时,代码里没有这个break,循环能正常遍历所有分割后的单词,因此可以正常输出全部内容。

修正后的代码

把while循环内的break删掉即可,同时建议在case 'l'分支末尾添加break(避免后续case分支被误执行,这是switch语句的良好编程习惯):

int main(int argc, char *argv[]) {

  char phrase[256];
  printf("type a phrase to examine\n\n");
  fgets(phrase, 256, stdin);

  printf("phrase: %s\n", phrase);

  int opt;

  while ((opt = getopt(argc, argv, "l")) != -1) {
     switch (opt) {
     case 'l':
         // prints all words as a list
         char *token = strtok(phrase, " ");

         while (token != NULL) {
             printf("%s\n", token);
             token = strtok(NULL, " ");
             // 移除多余的break
         }
         break; // 跳出当前case分支
     }
 }
 return 0;
}

额外优化:fgets会把输入的换行符也读入phrase,如果不想让最后一个单词带换行符,可以把分割符改成" \n",即strtok(phrase, " \n"),这样能同时分割空格和换行符。

内容的提问来源于stack exchange,提问作者imaginary flower

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 22:42:36