我正在尝试使用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 []中等等。
答案 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);
}
}