字符串切分函数:strtok与strtok_r

时间:2022-06-04 20:51:18

strtok函数

    函数原型:char *strtok(char str[], const char *delim)。

    功能:分解字符串为一组字符串,str为要分解的字符串,delim为分割符。

    说明:函数strtok()將一字符串按指定分割符切分为子串。当strtok在原串str中发现分割符delim时,將该字符转换为'\0'(字符串的结尾     符)。 在第一次调用时,strtok()函数必须將原串str作为第一个参数,后继的调用则將第一个参数设置为NULL。每次调用成功则返回指向     被切分片段的指针。

    返回值:从str首部开始的依次被切分出来的字符串,当没有被分割的串时,返回NULL。 所有的delim字符將被过滤掉。

    C语言示例

/**
* test.c
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
char str[] = "i am a beautiful girl";
char *ptr = NULL;
ptr = strtok(str, " ");
while (ptr != NULL)
{
printf("%s\n", ptr);
ptr = strtok(NULL, " ");
}
exit(0);
}
需注意:strtok()函数不是线程安全的,函数將每次调用后的字符串位置保存在一个函数内部的静态局部变量中,如果有多个线程调用这个函数,有可能出现冲突。


strtok_r函数

    函数原型:char *strtok_r(char s[], const char *delim, char **saveptr);

    说明:strtok_r()函数自定义指针来指向切分出的字符串,需传入参数saveptr,它是线程安全的。

C示例代码

/**
* test_r.c
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
char str[] = "i am a handsome boy";
char *ptr = NULL;
char *saveptr = NULL;
ptr = strtok_r(str, " ", &saveptr);
while (ptr != NULL)
{
printf("%s\n", ptr);
ptr = strtok_r(NULL, " ", &saveptr);
}
exit(0);
}