strsep strpbrk

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

int main(void)
{
	char s[] = "aa,bb,cc.11,22,33";
	char *delim = ",.";

	char *s1 = s;

	for (;;) {
		char *t = strsep(&s1, delim);
		if (!t)
			break;
		printf("%s\n", t);
	}

	return 0;
}

执行结果:

$ ./a.out 
aa
bb
cc
11
22
33

delim 为分隔符, 如果 s 中有 delim 中任意一字符, 则将其分割为两个字符串, 并将 s 中分隔符的位置置为'\0'.

返回头地址, 每执行一次, s1指向分割的字串的后一部分.

如果 s 中有多个连续分割符, 则每次返回的都是一个 '\0'. 如:


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

int main(void)
{
	char s[] = "aa,bb,cc.,.,.,,11,22,33";
	char *delim = ",.";

	char *s1 = s;

	for (;;) {
		char *t = strsep(&s1, delim);
		if (!t)
			break;
		printf("%s\n", t);
	}

	return 0;
}

执行结果:

aa
bb
cc






11
22
33

strsep() 的实现中用到了 strpbrk()

       #include <string.h>

       char *strpbrk(const char *s, const char *accept);

在 s 中查在 accept 中的任意字符, 并返回 s 中该字符的位置.

所以 strsep() 可以实现为:

char *strsep(char ** __restrict s1, const char * __restrict s2)
{
	register char *s = *s1;
	register char *p;

	p = NULL;
	if (s && *s && (p = strpbrk(s, s2))) {
		*p++ = 0;
	}

	*s1 = p;
	return s;
}
posted @ 2014-12-04 15:18  sammei  阅读(484)  评论(0编辑  收藏  举报