strtok 是如何工作的?

How strtok works?

#include <stdio.h>
#include<string.h>

int main() {
    char a[]="hey -* there -* minecraft-; jukebox! ";
    char *p=strtok(a,"-");
    //printf("%s",a);        --line-id(00)
    while(p!= NULL)
    {
        printf("%s",p);      //line-id(01)
        p=strtok(NULL,"-");
    }
    printf("\n");
    p=strtok(a,"*");
    while(p!=NULL)
    {
        printf("%s",p);
        p=strtok(NULL,"*");
    }
    return 0;
}

输出:

hey * there * Minecraft; jukebox! 
hey 

但是我需要的输出是:

hey * there * Minecraft; jukebox! 
hey there Minecraft jukebox!

Q) 为什么我不能将 line-id(01) 更改为 print("%s",*p) 因为 p 是一个指针我们应该使用 *p 来获取值,p 指向右边..?我遇到分段错误。

Q) 如果我使用 print("%s",a) 我会在 line-id(00) 中得到 hey 作为输出;为什么?

Q) 如果可能请解释一下在strtok()中使用的指针p。 strtok 是如何工作的?

strtok() 修改输入字符串。先复制它。 strdup() 是你的朋友。

如果你的编译器抱怨它找不到 strdup() copy/paste this in.

char *strdup(const char *s)
{
    size_t len = strlen(s) + 1;
    char *t = malloc(len);
    if (!t) return NULL;
    memcpy(t, s, len);
    return t;
}

从 char 数组中删除定界符的另一种方法是用后续字符覆盖定界符,从而缩小数组。

#include <stdio.h>
#include<string.h>

int main() {
    char a[]="hey -* there -* minecraft-; jukebox! ";
    char delimeters[] = "-*;";
    char *to = a;
    char *from = a;

    for ( int each = 0; each < 3; ++each) {//loop through delimiters
        to = a;
        from = a;
        while ( *from) {//not at terminating zero
            while ( *from == delimeters[each]) {
                ++from;//advance pointer past delimiter
            }
            *to = *from;//assign character, overwriting as needed
            ++to;
            ++from;
        }
        *to = 0;//terminate
        printf ( "%s\n", a);
    }
    return 0;
}

输出

hey * there * minecraft; jukebox! 
hey  there  minecraft; jukebox! 
hey  there  minecraft jukebox!