在 switch 语句中标记字符串 - C

Tokenizing a string inside a switch statement - C

提问人:imaginary flower 提问时间:10/26/2023 最后编辑:Luis Coloradoimaginary flower 更新时间:10/27/2023 访问量:51

问:

我在 switch 语句中使用 strtok 时遇到了很多麻烦。代码如下

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;
         }
     }
 }
 return 0;
}

当它打印时,它只显示第一个单词,但在空格之后没有其他内容

我还尝试过在 Switch 语句中不使用 strtok,但它工作正常。我不确定我做错了什么。

C switch-语句 strtok

评论

2赞 Barmar 10/26/2023
在第一次迭代中跳出循环。 如果要查看所有令牌,则不应在循环中。whilebreak
0赞 Barmar 10/26/2023
这与 无关,如果您使用switchif
1赞 imaginary flower 10/26/2023
就是这样!!这解决了整个问题,非常感谢!

答:

0赞 Luis Colorado 10/27/2023 #1

该语句应该在循环之外。你应该已经意识到自己是否正确地缩进了来源(我编辑了你的问题,以使其更明显,虽然)。break;while

在第一次通过循环后,你得到 和 你离开循环,而不是退出语句。break;switch

     case 'l':
         //prints all words as a list
         char *token = strtok(phrase, " ");

         while (token != NULL) {
             printf("%s\n", token);
             token = strtok(NULL, " ");
         }
         break;  /* now the break gets out of the switch */

会做得更好。

恕我直言,有一种更具可读性的方法,可以让您使用循环:for

         //prints all words as a list
         for (char *token = strtok(phrase, " ");
              token != NULL;
              token = strtok(NULL, " "))
         {
             printf("%s\n", token);
         }