40

如何将字符串拆分为标记,然后将它们保存在数组中?

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

输出将是这样的

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

请帮我

4

3 回答 3

45
#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;
}
于 2013-03-18T08:28:02.147 回答
13

您可以使用strtok()

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

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

while(array[i] != NULL)
   array[++i] = strtok(NULL, "/");
于 2013-03-18T08:22:57.230 回答
1

为什么strtok()是个坏主意

不要strtok()在普通代码中strtok()使用,使用static有问题的变量。在嵌入式微控制器上有一些用例,其中static变量有意义,但在大多数其他情况下避免使用它们。strtok()当超过 1 个线程使用它、在中断中使用它或在某些其他情况下,在连续调用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,

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

你应该做什么

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

于 2020-12-02T11:41:03.443 回答