(C) 带有多个空格/制表符的strtok,使用指针检查null



我正试图使用strtok()将字符串拆分为两个令牌,这两个令牌中可能混合了空格和制表符。

所以我做了这个:

struct strstr
{
    char *str, 
         *one, 
         *two;
};
typedef struct strstr *STRSTR;
void split(STRSTR);
int main()
{
    STRSTR str = malloc(sizeof(struct strstr));
    str->str = malloc(256);
    fgets(str->str, 256, stdin);
    split(str);
    printf("%s, %sn", str->one, str->two);
    free(str->str);
    free(str);
    return 0;
}
void split(STRSTR str)
{
    int i;
    char *temp = str->str;
    while(isspace(*(str->str)))
        str->str++;
    str->one = strtok(str->str, " t");
    for(i = 0; i < strlen(str->one); i++)
    {
        if(!isspace(str->one[i]))
            str->str++;
    }
    str->str++;
    if(str->str != NULL)
    {
        puts("In null if");
        str->two = strtok(str->str, "");
    }
    str->str = temp;
}

例如,如果您输入Hello Earth lingss,它将打印出Hello, Earth lingss,这是完美的。

但是,如果我只输入Hello,那么split函数将进入if(str->str != NULL)语句内部。如何用我现有的代码阻止它这样做?

编辑:还有另一个问题,如果有人不介意的话。CCD_ 6将仅指向CCD_ 7中的第一个字。我怎样才能把它指向整件事呢?

在分割函数中的最后一个if块之前添加此语句

str->str = strtok(str->str," t");

str->str = strtok(str->str," t");
if(str->str != NULL)
{
    puts("In null if");
    str->two = strtok(str->str, "");
}

您根据"t"作为分隔符来分割字符串,但从未更改str->str字符串,请使用上面的代码段,它应该可以很好地进行

strtok是一个有趣的函数,它既修改传递的字符串,又在内部存储有关它的信息。您应该将字符串传递给strtok一次,然后在后续调用中传递NULL。例如,如果您的目标是简单地将字符串分解为令牌(这显然是strtok的作用),那么类似于:

#define BUFFER_SIZE 256
int main(void) {
    char *buffer = malloc(BUFFER_SIZE);
    if (!buffer) {
        return -1;
    }
    fgets(buffer, BUFFER_SIZE, stdin);
    char *word;
    char *ptr = buffer;
    printf("Tokens: [");
    while ((word = strtok(ptr, " tn"))) {
        printf("%s, ", word);
        ptr = NULL;
    }
    printf("]n");
    free(buffer);
}

将起作用。当我运行这样的代码时:

./quick
when in the fun   apple         orange

我得到以下结果:

Tokens: [when, in, the, fun, apple, orange, ]

重要的是,我只是在第一次通过循环时将buffer指针传递给strtok。之后,它被传递为NULL。

最新更新