返回首页   进站必读

8.9 strtok/strtok\_r


8.9 strtok/strtok_r

分割字符串

#include <string.h>
char *strtok(char *str, const char *delim);
char *strtok_r(char *str, const char *delim, char **saveptr);
返回值:每次调用依次返回字符串str中的一个Token,如果到达str末尾就返回NULL

参数str是待分割的字符串,delim是分割符,可以指定一个或多个分割符,strtok遇到其中任何一个分割符就会分割字符串。
举例:

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

int main(int argc, char *argv[])
{
	char str[] = "root:x::0:root:/root:/bin/bash:";
	char *token;

	token = strtok(str, ":");
	printf("%s\n", token);
	while((token = strtok(NULL, ":")) != NULL)
	printf("%s\n", token);

	return 0;
}

$./a.out
root
x
0
root
/root
/bin/bash

strtok_r()函数是一个可重入版本的strtok()函数。
saveptr的参数是一个char *类型的变量,传入到saveptr中用来保存被分割剩下的字符串的首地址。
举例:

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

int main(int argc, char *argv[])
{
	char *str1, *str2, *token, *subtoken;
	char *saveptr1, *saveptr2;
	int j;

	if (argc != 4) {
		printf("error\n");
		exit(1);
	}

	for (j = 1, str1 = argv[1]; ; j++, str1 = NULL) {
		token = strtok_r(str1, argv[2], &saveptr10);
		if (token == NULL)
			break;
		printf("%d: %s\n", j, token);

		for (str2 = token; ; str2 = NULL) {
			subtoken = strtok_r(str2, argv[3], &saveptr2);
			if (subtoken == NULL)
				break;
			printf("--> %s\n", subtoken);
		}
	}

	return 0;
}

$./a.out 'a/bbb///cc;xxx:yyy;' ';:' '/'
1:a/bbb///cc
-->a
-->bbb
-->cc
2:xxx
-->xxx
3:yyy
-->yyy