C语言 将字符串拆分为标记并将其保存在数组中

fbcarpbf  于 2023-03-12  发布在  其他
关注(0)|答案(3)|浏览(110)

如何将一个字符串拆分为一个标记,然后将它们保存在数组中?
具体来说,我有一个字符串"abc/qwe/jkh",我想把"/"分开,然后把标记保存到一个数组中。
输出将为

array[0] = "abc"
array[1] = "qwe"
array[2] = "jkh"

请帮帮我

uurv41yg

uurv41yg1#

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

uxhixvfz2#

您可以使用strtok()

char string[] = "abc/qwe/jkh";
char *array[10];
int i = 0;

array[i] = strtok(string, "/");

while(array[i] != NULL)
   array[++i] = strtok(NULL, "/");
ee7vknir

ee7vknir3#

为什么strtok()是个坏主意
不要在正常代码中使用strtok()strtok()使用static变量会有一些问题。在嵌入式微控制器的某些用例中,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,
ABC, DEF, GHI,

但你会得到

abc, def, ghi,

这是因为在printContent()中调用strtok(),重置main()中生成的strtok()的内部状态,返回后strtok()的内容为空,下一次调用strtok()返回NULL

你应该做什么

当你使用POSIX系统时你可以使用strtok_r(),这个版本不需要static变量。如果你的库没有提供strtok_r(),你可以自己编写它的版本。这应该不难,而且Stackoverflow不是一个编码服务,你可以自己编写它。

相关问题