strtok函数和strtok_r函数的简单实现

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值