首页 > 解决方案 > strtok 是如何工作的?

问题描述

#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) 我得到 hey 作为 line-id(00) 中的输出;为什么?

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

标签: cpointersstrtok

解决方案


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

如果您的编译器抱怨它找不到strdup()复制/粘贴它。

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

推荐阅读