strtok&strsep
strtok,strtok_r,strsep--extract tokens from strings
Tje strsep() function was introduced as a replacement for strtok, since the latter cannot handle empty fileds. However, strtok conforms to C89/C99 and hence is more portable.
#include <string.h>
char *strtok(char *str, const char *delim);
char *strtok_r(char *str, const char *delim, char **saveptr); 可重入
char *strsep(char **stringp, const char *delim);
根据delim字符串分解str。
saveptr用于保存每次调用完参数后下一次进行字符串分割时的起始地址,内部设定。
delim可为多个字符,每个字符都分解str,str中出现的不连续分解字符都改写为‘\0’, 连续的分割符被认为是一个,str中开始和结束的分隔符被忽略。
strtok使用:1)首次调用分割字符串参数为str,之后都为NULL。
2)返回NULL或分割字符串(不包含delim字符)
strtok_r使用:1)首次调用str指向要分割的字符串,saveptr忽略;接下来调用中str为NULL,saveptr应该不改变。
2)不同字符串可以同时被解析,指定不同saveptr参数。
使用注意:1)函数修改第一个参数str。
2)str不能是常量string。
3)strtok()用到静态buffer,因此非线程安全。
man中提供的一个例程
#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 != )
{
fprintf(stderr, "Usage: %s string delim subdelim\n", argv[]);
exit(EXIT_FAILURE);
} for(j = , str1 = argv[]; ; j++, str1 = NULL)
{
token = strtok_r(str1, argv[], &saveptr1);
if(token == NULL)
{
break;
}
printf("%d: %s\n", j, token); for(str2 = token;; str2 = NULL)
{
subtoken = strtok_r(str2, argv[], &saveptr2);
if(subtoken == NULL)
{
break;
}
printf("\t --> %s\n", subtoken);
}
} exit(EXIT_FAILURE); return ;
}
~$./a.out 'a/bbb///cc;xxx:yyy:' ':;' '/'
: a/bbb///cc
--> a
--> bbb
--> cc
: xxx
--> xxx
: yyy
--> yyy
strsep与strtok等同,与strtok相比,strsep可以处理空字符串。
If *stringp is NULL, the strsep() function returns NULL and does nothing else.
char *ptr;
char *now_ptr;
for (ptr = strsep(&now_ptr,";"); ptr != NULL; ptr = strsep(&now_ptr,";"))
strtok&strsep的更多相关文章
- C语言 字符串切割
#include <stdio.h> #include <stdlib.h> #include <string.h> /* 字符串切割函数 */ /* 知识补充: ...
- strsep和strtok_r替代strtok
char *strtok(char *str, const char *delim) 会修改数据源.外部加锁才线程安全(strtok执行结束再解锁执行另一个strtok循环知道工作完成) 主要是以互斥 ...
- C/C++ 字符串分割: strtok 与 strsep 函数说明
函数原型: char *strtok(char *s, const char *delim); char *strsep(char **s, const char *delim); 功能:strtok ...
- 【C】——strtok()和strtok_r()
下面的说明摘自于最新的Linux内核2.6.29,说明了strtok()这个函数已经不再使用,由速度更快的strsep()代替 /** linux/lib/string.c** Copyright ( ...
- 内存及字符串操作篇strlen strchar strcmp strcoll strcpy strdup strstr strtok strspn strrchr bcmp bcopy bzero index memccpy memset
bcmp(比较内存内容) 相关函数 bcmp,strcasecmp,strcmp,strcoll,strncmp,strncasecmp 表头文件 #include<string.h> 定 ...
- loadrunner中切割strtok字符串
http://blog.sina.com.cn/s/blog_7ee076050102vamg.html http://www.cnblogs.com/lixiaohui-ambition/archi ...
- 字符串分割函数 STRTOK & STRTOK_R (转)
1.一个应用实例 网络上一个比较经典的例子是将字符串切分,存入结构体中.如,现有结构体 typedef struct person{ char name[25]; char sex[1 ...
- strtok和strtok_r
1.strtok()函数的用法 函数原型:char *strtok(char *s, const char *delim); Function:分解字符串为一组字符串.s为要分解的字符串,delim为 ...
- 浅谈strtok
原型:char *strtok(char *s, char *delim); 功能:分解字符串为一组标记串.s为要分解的字符串,delim为分隔符字符串. 说明:首次调用时,s必须指向要分解的字符串, ...
随机推荐
- GC、LOH和Performance相关
Performance Now that we have a basic model for how things are working, let's consider some things th ...
- 20145235 《Java程序设计》第5周学习总结
教材学习内容总结 8.1语法与继承架构 try和catch语法,如果被try{}的语句出现了catch()的问题就执行catch{}的语句. 错误的对象都继承于java.long.Throwable, ...
- Windows2008 R2修改3389端口教程
默认的3389端口有必要修改么,这个端口,我建议是修改一下为好,最好改大一点,这样安全性会高一点,但然面对高手级攻击,就没有用了,通常高手级过NMAP扫描一个你的IP地址,端便全然显现出来了,好了,下 ...
- nignx的proxy_cache
http段配置: #cache configclient_body_buffer_size 512k;proxy_connect_timeout 5;proxy_read_timeout 60;pro ...
- 【翻译】How To Tango With Django 1.5.4 第一章
1.概览 这本书的目的就是为了给你提供Django实战开发的指导,这本书主要是为学生设计的,它提供了开发并运行第一个web应用程序的详细的指导步骤,并且指导你怎么将它发布到web服务器上. 本书就是为 ...
- hbase与mapreduce集成
一:运行给定的案例 1.获取jar包里的方法 2.运行hbase自带的mapreduce程序 lib/hbase-server-0.98.6-hadoop2.jar 3.具体运行 4.运行一个小方法 ...
- 分布式中,zookeeper的部署
一:准备 1.概述 为分布式应用提供协调服务的项目 类似于文件系统那样的树形数据结构 目的:将分布式服务不再由于协作冲突而另外实现协作服务 2.数据结构 树形数据结构 zookeeper的每个节点都是 ...
- jdk1.7的collections.sort(List list)排序问题
1.7使用旧排序: System.setProperty("java.util.Arrays.useLegacyMergeSort", "true"); 1.7 ...
- 轮询、select、 epoll
网卡设备对应一个中断号, 当网卡收到网络端的消息的时候会向CPU发起中断请求, 然后CPU处理该请求. 通过驱动程序 进而操作系统得到通知, 系统然后通知epoll, epoll通知用户代码. 一. ...
- ubuntu 14 安装 JDK
$ sudo mkdir /usr/lib/java $ sudo tar zxvf jdk-7u21-linux-i586.tar.gz -C /usr/lib/java $ cd /usr/lib ...