c - 如何使用strtok分隔和获取新的字符串

标签 c string strtok

我正在尝试使用 strtok 分解字符串并将提取的字符串存储到新数组中,以便我可以将它们单独用作命令或其他东西。

#include <stdio.h>
#include <string.h>

main()
{

   char test_string[50]="string to split up";
   char *sub_string;

   /* Extract first string */
   printf("%s\n", strtok(test_string, " "));

   /* Extract remaining strings   */
   while ( (sub_string=strtok(NULL, " ")) != NULL)
   {
       printf("%s\n", sub_string);
   }
}

这会打印出我正在寻找的不带空格的字符串,但是我如何才能将每个单词保存到单独的字符串变量中而不是仅仅打印它们呢?基本上我希望将“string”保存到 string1[] 中,将“to”保存到 string2[] 中,依此类推。

最佳答案

strtok 操作将原始字符串“切碎”,因此您实际上可以执行以下操作:

#include <stdio.h>
#include <string.h>

int main(void)
{

   char test_string[50]="string to split up";
   char *sub_string[50];
   int ii = -1;
   /* Extract first string */
   sub_string[++ii]=strtok(test_string, " "));
   printf("%s\n", sub_string[0]);
   /* Extract remaining strings   */
   while ( (sub_string[++ii]=strtok(NULL, " ")) != NULL)
   {
       printf("%s\n", sub_string[ii]);
   }
}

基本上,strtok 在找到的分隔符处插入 '\0',并返回指向标记开头的指针。因此,您实际上不需要为 sub_string 元素分配新内存 - 只需分配给数组即可。我把数组的元素个数设置为50;实际上,您需要确保您的 while 循环在您用完空间之前停止……

一个小图表可能会有所帮助:

原始字符串:

s t r i n g    t o    s p l i t    u p \0

在第一次调用 strtok 之后:

s t r i n g \0 t o    s p l i t    u p \0

^ first pointer

下一次通话后:

s t r i n g \0 t o \0 s p l i t    u p \0

               ^ second pointer

第三次调用后:

s t r i n g \0 t o \0 s p l i t \0 u p \0

                      ^ third pointer

等等

如果您想将子字符串存储在“不同的变量”中(不确定为什么不考虑 sub_string[0]sub_string[1] 等)方便的“不同变量”,但我会把它留到下一次),你可以将上面的更改为:

#include <stdio.h>
#include <string.h>

int main(void)
{

   char test_string[50]="string to split up";
   char *string1, *string2, *string3, *string4, *string5;
   int n = 0;
   /* Extract first string */
   if(strlen(test_string)==0) return 0;

   string1=strtok(test_string, " "));
   n++;
   printf("%s\n", string1);

   while( n < 5 ) {
     string2 = strtok(NULL, " ");
     if (string2 == NULL) break; else n++;
     string3 = strtok(NULL, " ");
     if (string3 == NULL) break; else n++;
     string4 = strtok(NULL, " ");
     if (string4 == NULL) break; else n++;
     string5 = strtok(NULL, " ");
     if (string4 == NULL) break; else n++;
  }
  printf("the total number of strings found is %d\n", n);
}

我只是认为它不如使用 char * 数组优雅。你能明白我的意思吗?

关于c - 如何使用strtok分隔和获取新的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21324005/

相关文章:

c++ - 在 strtok 之后比较字符串

c - 从标准输入读取输入参数时的意外行为

c++ - 发布版本中运行时间过长(调试版本正常)

C - 链表下一个节点为空

java - Android - 获取自定义字符串

C - 动态字符串释放和动态数组

c - 为什么 strtok() 拆分我什至没有传递给它的字符串?

c - UDP 端口扫描器问题,C

java - 关于比较两个字符串

c - 如何正确获取一行并用 C 解析它