如何将字符串分割为令牌并将它们保存在数组中?
具体而言,我有一个字符串"abc/qwe/jkh"
。我想要按照"/"
进行分隔,然后将令牌保存到一个数组中。
输出将会是这样的:
array[0] = "abc"
array[1] = "qwe"
array[2] = "jkh"
请帮助我
#include <stdio.h>
#include <string.h>
int main ()
{
char buf[] ="abc/qwe/ccd";
int i = 0;
char *p = strtok (buf, "/");
char *array[3];
while (p != NULL)
{
array[i++] = p;
p = strtok (NULL, "/");
}
for (i = 0; i < 3; ++i)
printf("%s\n", array[i]);
return 0;
}
strtok()
函数。char string[] = "abc/qwe/jkh";
char *array[10];
int i = 0;
array[i] = strtok(string, "/");
while(array[i] != NULL)
array[++i] = strtok(NULL, "/");
strtok()
是一个坏主意在正常代码中不要使用strtok()
,strtok()
使用static
变量存在一些问题。在嵌入式微控制器上有一些用例适合使用static
变量,但在大多数其他情况下请避免使用。当超过1个线程使用它时,当它在中断中使用时或当在连续调用strtok()
之间处理多个输入的某些其他情况时,strtok()
的行为会出现意外情况。
考虑以下示例:
#include <stdio.h>
#include <string.h>
//Splits the input by the / character and prints the content in between
//the / character. The input string will be changed
void printContent(char *input)
{
char *p = strtok(input, "/");
while(p)
{
printf("%s, ",p);
p = strtok(NULL, "/");
}
}
int main(void)
{
char buffer[] = "abc/def/ghi:ABC/DEF/GHI";
char *p = strtok(buffer, ":");
while(p)
{
printContent(p);
puts(""); //print newline
p = strtok(NULL, ":");
}
return 0;
}
abc, def, ghi,
ABC, DEF, GHI,
但你会获得
abc, def, ghi,
printContent()
中调用了strtok()
,重置了在main()
中生成的strtok()
的内部状态。返回后,strtok()
的内容为空,下一次调用strtok()
将返回NULL
。
如果你使用的是POSIX系统,你可以使用strtok_r()
,这个版本不需要static
变量。如果你的库没有提供strtok_r()
,你可以编写自己的版本。这应该不难,Stackoverflow不是一个编码服务,你可以自己编写。
strtok()
放在图书馆中是一个糟糕的想法。正如我在我的回答中所写的那样,这不仅是多线程应用程序中的问题。在你发表评论之前,请先阅读,谢谢。 - 12431234123412341234123
strtok()
在多线程程序、库中以及某些可能在循环未完成的情况下第二次调用strtok()
的其他程序中效果不佳。当strtok_r()
不可用时,编写自己的函数或使用strtok_r()
可能是更好的解决方案。 - 12431234123412341234123