我正在尝试使用 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/