原型:
char *strtok(char s[], const char *delim);
功能:
分解字符串为一组字符串。s为要分解的字符串,delim为
分隔符字符串。
例如:strtok("abc,def,ghi",","),最后可以分割成为abc def ghi.尤其在点分十进制的IP中提取应用较多。
说明:
strtok()用来将字符串分割成一个个片段。
参数s指向欲分割的字符串,参数delim则为分割字符串中包含的所有字符。
当strtok()在参数s的字符串中发现参数delim中包涵的分割字符时,则会将该字符改为\0 字符。
在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。
每次调用成功则返回指向被分割出片段的指针。
返回值:
从s开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。
所有delim中包含的字符都会被滤掉,并将被滤掉的地方设为一处分割的节点。
例子:
#include <string.h>
#include <stdio.h>
#include <string.h>
#include <stdio.h>
int main(void)
{
char input[16] = "abc,d,erf,hel";
char *p;
/* strtok places a NULL terminator
* in front of the token, if found
*/
p = strtok(input, ",");
if (p)
printf("1: %s\n", p);
/* A second call to strtok using a NULL
* as the first parameter returns a pointer
* to the character following the token
*/
p = strtok(NULL, ",");
if (p)
printf("2: %s\n", p);
p = strtok(NULL, ",");
if (p)
printf("3: %s\n", p);
p = strtok(NULL, ",");
if (p)
printf("4: %s\n", p);
return 0;
}
函数第一次调用需设置两个参数。第一次分割的结果,返回串中第一个 ',' 之前的字符串,也就是上面的程序第一次输出abc。
第二次调用该函数strtok(NULL,","),第一个参数设置为NULL。结果返回分割依据后面的字串,即第二次输出d。
后面几次都是NULL。
例2:
下面的说明摘自于最新的Linux内核2.6.29,说明了这个函数已经不再使用,由速度更快的strsep()代替
后面几次都是NULL。
例2:
#include<string.h>
#include<stdio.h>
int main(void)
{
char input[16]="a,b,c,d";
char *p;
p=strtok(input,",");
while(p) {
printf("%s\n",p);
p=strtok(NULL,",");
}
return 0;
}
输出:
$ ./a.out
a
b
c
d
下面的说明摘自于最新的Linux内核2.6.29,说明了这个函数已经不再使用,由速度更快的strsep()代替
/*
* linux/lib/string.c
*
* Copyright (C) 1991, 1992 Linus Torvalds
*/
/*
* stupid library routines.. The optimized versions should generally be found
* as inline code in <asm-xx/string.h>
*
* These are buggy as well..
*
* * Fri Jun 25 1999, Ingo Oeser <ioe@informatik.tu-chemnitz.de>
* - Addedstrsep() which will replace strtok() soon (because strsep() is
*reentrantand should be faster). Use onlystrsep() in new code, please.
*
* * Sat Feb 09 2002, Jason Thomas <jason@topic.com.au>,
* Matthew Hawkins <matt@mh.dropbear.id.au>
* - Kissed strtok() goodbye
*/
strsep()原型:
char *strsep(char **stringp, const char *delim);功能:分解字符串为一组字符串。
从stringp指向的位置起向后扫描,遇到delim指向的字符串中的字符后,将此字符替换为NULL,返回stringp指向的地址。
它适用于分割“关键字”在两个字符串之间只“严格出现一次”的情况。
如果“关键字”在字符串之间连续出现,可使用如下技巧解决:
char str[] = "abcdefg";
char *p = str,key_point;
while(1)
{
while ( key_point = strsep(&p,"cd"))//关键字为c或d,它们连续出现了
{
//函数遇到c时,key_point指向c返回,遇到d时key_point指向d返回(注意此时d已经被改写为'\0'了)
if (*key_point == 0)
continue;//遇到连续的关键字,返回一个指向\0的指针,继续往后找就是
else
break;//分割出一个正常的字符串,快去打印吧!
}
printf("%s\n",key_point);
}
本文详细介绍了C语言中用于字符串分割的strtok函数的使用方法及注意事项,包括如何通过strtok处理点分十进制IP地址等场景。同时,文章提到了strtok已被更高效的strsep函数取代的原因,并提供了示例代码演示strsep的使用。
851

被折叠的 条评论
为什么被折叠?



