1 strtok
来自Linux-2.5.0中的string.c
strtok函数的源码如下,其功能是对传进去的C风格字符串s进行分割,分割符由第二个参数ct给出网上找到的一段代码(http://zhidao.baidu.com/link?url=-kcqYo2nAhvDoxGS04TXg5nShuRmiJ3jPenuLvUlHkOwRQjK4jbssZgeNs1F_ue_P8QDaKIUhKjeS1bXLHKmua),介绍strtok的使用
/**
* strtok - Split a string into tokens
* @s: The string to be searched
* @ct: The characters to search for
*
* WARNING: strtok is deprecated, use strsep instead.
*/
char * ___strtok;
char * strtok(char * s,const char * ct)
{
char *sbegin, *send;
sbegin = s ? s : ___strtok;//首次调用时s为真,所以sbegin指向s的首地址
if (!sbegin) { //如果sbegin为NULL值说明传递的字符串为空,直接返回
return NULL;
}
sbegin += strspn(sbegin,ct);//返回字符串sbegin中第一个不在指定字符串ct中出现的字符下标
if (*sbegin == '\0') { //如果sbegin已经为字符串结束符则返回
___strtok = NULL;
return( NULL );
}
send = strpbrk( sbegin, ct);//依次检验字符串sbegin中的字符,当被检验字符在字符串ct中也包含时,则停止检验,并返回被包含的字符
if (send && *send != '\0') //将分割字符的位置置为'\0'
*send++ = '\0'; //然后将send的指针向后移动一个位置
___strtok = send; //将移动后的send赋给全局变量__strtoke,下一次循环调用时,由于传递给strtok的第一个参数为NULL,所以sbegin=___strtok,也就是上一次的位置send,直到将字符串分割完毕
return (sbegin);
}
strtok的使用如下
#include <string.h>
#include <stdio.h>
main()
{
char s[]= "Wang NIang Huangddddangccccang ldldldang XXXXXXXX ";
char *d= "ang ";//在s串中将包含有 "ang "的位置处加上NULL,注意空格的输出
char *p;
p=strtok(s,d);//第一次调用,传要处理的串参数地址s
while(p)
{
printf( "%s\n ",p);
p=strtok(NULL,d); }
getchar();
return 0;
}
2 strtok_r
#include<stdio.h>
#include<string.h>
#define INFO_MAX_SZ 255
int main()
{
int in=0;
char buffer[INFO_MAX_SZ]="Fred male 25,John male 62,Anna female 16";
char *p[20];
char *buf=buffer;
char *outer_ptr=NULL;
char *inner_ptr=NULL;
while((p[in]=strtok_r(buf,",",&outer_ptr))!=NULL)
{
buf=p[in];
while((p[in]=strtok_r(buf," ",&inner_ptr))!=NULL)
{
in++;
buf=NULL;
}
p[in++]="***";
buf=NULL;
}
printf("Here we have %d strings\n",in);
for (int j=0; j<in; j++)
printf(">%s<\n",p[j]);
return 0;
}
3 linux下hash_map键为string
http://blog.youkuaiyun.com/langwenjing/article/details/8290678
http://no001.blog.51cto.com/1142339/1073027/