如何使用strtok来分隔和获取新字符串

时间:2014-01-24 03:43:50

标签: 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 []中等等。

2 个答案:

答案 0 :(得分:1)

原始字符串被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 *数组那样优雅。你能看出我的观点吗?

答案 1 :(得分:0)

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

main()
{

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

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

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