簡體   English   中英

如何使用strtok分隔並獲取新字符串

[英]How to use strtok to delimit and get new strings

我正在嘗試使用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);
   }
}

這樣會打印出我要查找的字符串,不帶空格,但是我將如何將每個單詞保存到單獨的字符串變量中,而不僅僅是打印它們? 基本上,我希望將“字符串”保存到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]等是方便的“不同變量”,但我會再留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 *數組那樣優雅。 你明白我的意思嗎?

#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);
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM