strtok、strtok_r 、strsep函数的问题

本文探讨了C语言中的字符串分割函数strtok、strtok_r和strsep。strtok由于其静态变量last存在多线程问题,已被Linux kernel弃用,推荐使用strsep。strsep函数的实现简洁高效,通过strpbrk检索分隔符并更新字符串。文中还提供了一段测试代码以帮助理解这三种函数的工作原理。
摘要由CSDN通过智能技术生成

首先看第一个strtok:

虽然strtok有诸多问题,已经被Linux kernel淘汰,由strsep替代,但了解这个函数的实现对我们理解C语言的运用极有裨益,也有过知名企业的面试中甚至出现了strtok函数的实现考察。

 

C 库函数 char *strtok(char *str, const char *delim) 分解字符串 str 为一组字符串,delim 为分隔符。

这个函数陷阱很多,我们先看一下这个函数一个实现(来源于apple opensource):

#include <stddef.h>
#include <string.h>

char *
strtok(s, delim)
	register char *s;
	register const char *delim;
{
	register char *spanp;
	register int c, sc;
	char *tok;
	static char *last;


	if (s == NULL && (s = last) == NULL)
		return (NULL);

	/*
	 * Skip (span) leading delimiters (s += strspn(s, delim), sort of).
	 */
cont:
	c = *s++;
	for (spanp = (char *)delim; (sc = *spanp++) != 0;) {
		if (c == sc)
			goto cont;
	}

	if (c == 0) {		/* no non-delimiter characters */
		last = NULL;
		return (NULL);
	}
	tok = s - 1;

	/*
	 * Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
	 * Note that delim must have one NUL; we stop if we see that, too.
	 */
	for (;;) {
		c = *s++;
		spanp = (char *)delim;
		do {
			if ((sc = *spanp++) == c) {
				
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值