strtok()_strsep()

本文详细介绍了C语言中用于字符串分割的strtok函数的使用方法及注意事项,包括如何通过strtok处理点分十进制IP地址等场景。同时,文章提到了strtok已被更高效的strsep函数取代的原因,并提供了示例代码演示strsep的使用。

原型:

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:
#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);
}






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值