想要使用特定字符将字符串分隔为标记

sam*_*m_k 1 c strtok

这里我有一个字符串表示字符数组.此数组也包含分隔符.现在我想只取出没有这个分隔符的字符串.

我正在使用strtok功能.

我想用这个分隔符分隔我的所有单词.

但是这里我在这段代码中遇到了一些问题.

请让我知道,如果我做错了或告诉我以不同的方式实现这个简单易行的方法,也要考虑内存风险.

这条线pch = strtok (str,&sep);没什么.问题只在这里.

码

/* strtok example */
#include <stdio.h>
#include <string.h>

#define SEPRATOR 0x03

int main ()
{
    char str[1024];
    int count = 0;
    char sep;
    memset(str,0,1024);
    sep = SEPRATOR;

    memcpy(str,"1",strlen("1"));
    count = count + strlen("1");
    str[count++] = sep;
    memcpy(str+count,"0",strlen("0"));
    count = count + strlen("0");
    str[count++] = sep;
    memcpy(str+count,"2",strlen("2"));
    count = count + strlen("2");
    str[count++] = sep;
    memcpy(str+count,"abc_1.0.xyz",strlen("abc_1.0.xyz"));
    count = count + strlen("abc_1.0.xyz");
    str[count++] = sep;
    memcpy(str+count,"3",strlen("3"));
    count = count + strlen("3");
    str[count++] = sep;
    memcpy(str+count,"23455.456",strlen("23455.456"));
    count = count + strlen("23455.456");

    printf("Input String = %s\n",str);

    char * pch;
    int pchcount = 0;
    pch = strtok (str,&sep);
    while (pch != NULL)
    {
        pchcount++;
        printf ("%d === %s\n",pchcount,pch);
        pch = strtok (NULL,&sep);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

hmj*_*mjd 6

第二个参数strtok()是一个以null结尾的字符串(char*),但是你传递了一个地址char.虽然a char*,它不会被null终止.改成:

char sep[2] = { SEPRATOR, 0 };
Run Code Online (Sandbox Code Playgroud)

相应地改变当前的用途sep:

str[count++] = sep[0];

pch = strtok(str, sep);
Run Code Online (Sandbox Code Playgroud)

您可能会发现snprintf()构建您的str比memcpy()调用序列更简单.

另外,如果要初始化str:

char str[1024] = ""; /* instead of performing a memset(). */
Run Code Online (Sandbox Code Playgroud)