Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将字符串拆分为令牌并将其保存在数组中_C_Split_Strtok - Fatal编程技术网

C 将字符串拆分为令牌并将其保存在数组中

C 将字符串拆分为令牌并将其保存在数组中,c,split,strtok,C,Split,Strtok,如何将字符串拆分为令牌,然后将其保存在数组中 具体来说,我有一个字符串“abc/qwe/jkh”。我想分离“/”,然后将令牌保存到数组中 输出将是这样的: array[0] = "abc" array[1] = "qwe" array[2] = "jkh" 请帮帮我你可以用 #包括 #包括 int main() { 字符buf[]=“abc/qwe/ccd”; int i=0; char*p=strtok(buf,“/”); 字符*数组[3]; while(p!=NULL) { 数组[i++]

如何将字符串拆分为令牌,然后将其保存在数组中

具体来说,我有一个字符串“abc/qwe/jkh”。我想分离
“/”
,然后将令牌保存到数组中

输出将是这样的:

array[0] = "abc"
array[1] = "qwe"
array[2] = "jkh"
请帮帮我你可以用

#包括
#包括
int main()
{
字符buf[]=“abc/qwe/ccd”;
int i=0;
char*p=strtok(buf,“/”);
字符*数组[3];
while(p!=NULL)
{
数组[i++]=p;
p=strtok(空,“/”;
}
对于(i=0;i<3;++i)
printf(“%s\n”,数组[i]);
返回0;
}
为什么
strtok()
是个坏主意 不要在普通代码中使用
strtok()
strtok()
使用有一些问题的
static
变量。在嵌入式微控制器上有一些用例,其中
静态
变量是有意义的,但在大多数其他情况下避免使用它们<当一个以上的线程使用代码>strtok()时,当在中断中使用它时,或者当在对
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,
这是因为在
printContent()
中调用
strtok()
,使
main()
中生成的
strtok()
的内部状态处于静止状态。返回后,
strtok()
的内容为空,对
strtok()
的下一次调用返回
NULL

你应该怎么做
使用POSIX系统时,可以使用
strtok_r()
,此版本不需要
静态变量。如果您的库没有提供strtok_r()
,您可以编写自己的版本。这应该不难,Stackoverflow不是一个编码服务,你可以自己编写。

如果我想比较数组[0]和数组[1],我应该怎么做?你可以使用另一个函数:If(strcmp(array[0],array[1])==0{//array[0]=array[1]}这假设令牌的数量是已知的。这一行的目的是什么(NULL,“/”;?
strtok()
在多线程程序、库或其他一些程序中工作不好,这些程序可能会使用不同的字符串第二次调用
strtok()
,而之前没有完成循环。
strtok\u r()
可能是更好的解决方案,或者在
strtok\u r()时编写自己的函数
不可用。可以将空指针指定为strtok()的第一个参数,在这种情况下,函数将继续扫描上一次成功调用函数结束的位置。效果非常好。如果我们不知道slpit元素的数量,如何进行动态计数..数组不能用变量初始化吗?这将在数组中放入4个元素,最后一个元素为NULL。
strtok()
不是一个好的解决方案,因为它需要不在堆栈或堆上的变量。OP从未提到它们在多线程中environment@sijanec他也没有说他不是。请记住,库应该是多线程保存的,并放置一个
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,