c++分割字符串,strtok与strtok_r的使用记录
2017-07-26 22:01
555 查看
strtok的使用
写在最开头,strtok是线程不安全的,在使用时一定要考虑到这点。strtok函数使用一个静态变量存储中间值,不要在多线程编程下使用这个函数,不然一定出错。这个函数头文件是 string.h,定义为:
char * strtok(char *s, const char *delim)
char* s为源字符串,即要被切分的字符串,char * delim为分隔符集合,意味着可以放入多个分隔符,都可以生效,比如可以这样 :
strtok(s,"\t"); strtok(s,"\t\r"); strtok(s,"\n\t");
该函数返回值即为切割完获得的第一个字符串,比如以空格分隔的字符串s,其指向字符串为“hi guys”,第一次执行后获得的返回值是”hi”。
以下是一个样例,执行完第一次后,后面的执行第一个参数可以为NULL,因为对应的字段已经存储在一个静态变量中了,下次可以直接调用。
/* strtok example */ #include <stdio.h> #include <string.h> int main () { char str[] ="- This, a sample string."; char * pch; printf ("Splitting string \"%s\" into tokens:\n",str); pch = strtok (str," ,.-"); while (pch != NULL) { printf ("%s\n",pch); pch = strtok (NULL, " ,.-"); } return 0; }
以上,是用例,当然也有线程安全的strtok可用,但是这个的函数的效率相当底下,不建议使用,看定义可以看出其结构和strtok类似,只是多了一个saveptr参数,这个参数是用来记录被分割字符串的,即使用者需要自己声明一个char ** saveptr传入其中,saveptr记录的是每次被分割后剩余的部分。比如”it is a nice day“,以空格分隔,执行完一次后saveptr上存储的是”is a nice day”。
定义如下:
char *strtok_r(char *str, const char *delim, char **saveptr);
用法与strtok类似,附上用例:
#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) { fprintf(stderr, "Usage: %s string delim subdelim\n", argv[0]); exit(EXIT_FAILURE); } for (j = 1, str1 = argv[1]; ; j++, str1 = NULL) { token = strtok_r(str1, argv[2], &saveptr1); 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); } } exit(EXIT_SUCCESS); }
最后,个人认为,这两个函数有着不小的缺陷,谨慎使用。
参考:
http://www.cplusplus.com/reference/cstring/strtok/
https://linux.die.net/man/3/strtok_r
相关文章推荐
- C++字符串分割strtok
- C++中使用指定字符分割字符串
- c++中怎么分割字符串之strtok 函数
- C/C++如何把一个特定分隔符分割的字符串划分为一个字符串数组,strtok(char *,char*)分割函数
- C语言:使用strtok()函数分割字符串
- C++ 字符串分割的一些记录
- c++ 使用正则表达式分割字符串
- C++的字符串分割函数的使用详解
- C++组合应用之strtok字符串分割、数组平分算法、动态数组函数传参
- C/C++分割字符串:strtok函数
- c/c++ 字符串分割 (strtok)
- c++ 字符串分割一、用strtok函数进行字符串分割 原型: char *strtok(char *str, const char *delim); 功能:分解字符串为一组字符串。 参数说明:
- 【C++】字符串分割 strtok_s
- C语言:使用strtok_s()函数简单分割字符串
- C实现分割字符串(使用strtok_s函数,完成C#的Split函数功能)
- C++ 使用正则表达式分割字符串
- 在C++中使用Apache的Log4cxx记录日志
- C++常用字符串处理函数及使用示例
- 使用STL流(stream)来简化C++“线程安全”日志记录
- C++备忘录(记录一些不常使用的语法规则)