#include <stdio.h>
#include <string.h>
char *mystrtok(char *str, const char *delim)
{
char *s_begin, *s_end;
static char *savep = "";
//"root:0::/root/bash:/usr/bin";
s_begin = (str != NULL) ? str : savep;
s_begin += strspn(s_begin, delim);
if(*s_begin == '\0'){
savep = "";
return NULL;
}
s_end = s_begin + strcspn(s_begin, delim);
if(*s_end != '\0')
*s_end++ = '\0';
savep = s_end;
return s_begin;
}
int main(void)
{
char str[] = "root:0::/ root/ bash:/usr/bin", *token;
token = mystrtok(str, ":");
printf("token:%s\n", token);
while((token = mystrtok(NULL, ":")))
printf("token:%s\n", token);
return 0;
}
strtok_r函数实现
#include <stdio.h>
#include <string.h>
char *my_strtok_r(char *s, const char *delim, char **save_ptr)
{
char *token;
if (s == NULL)
s = *save_ptr;
s += strspn(s, delim);
if (*s == '\0')
return NULL;
token = s;
s = strpbrk(token, delim); //查找字符串中第一个出现的指定字符
if (s == NULL)
*save_ptr = strchr(token, '\0');
else {
*s = '\0';
*save_ptr = s + 1;
}
return token;
}
int main(void)
{
char str[] = "root:0::/ root/ bash:/usr/bin", *token, *sp = NULL;
printf(" %s\n", str);
token = my_strtok_r(str, ":", &sp);
printf("token:%s\n", token);
while((token = my_strtok_r(NULL, ": ", &sp)))
printf("token:%s\n", token);
return 0;
}