strtok函数的使用注意事项

42 篇文章 4 订阅
40 篇文章 0 订阅

strtok函数的使用注意事项


1. 函数原型及其基本应用


    strtok函数是用来分解字符串的,其原型是:

char *strtok(char str[], const char *delim);

    其中str是要分解的字符串,delim是字符串中用来分解的字符,该函数返回分解后的字符串的起始位置指针。之所以是分解,就是说并没有生成新的字符串,只是在源字符串上面做了一些手脚,使得源字符串发生了变化,所以一定要注意,源字符串发生了变化!!!

    先从最简单的应用来看,看下面的例1。

// 例1
#include <string.h>

void main()
{  
    char s[] = "192.168.0.26";  
    char *delim = ".";  
    char *p;  
    printf("%s ", strtok(s, delim));  

    while((p = strtok(NULL, delim)))    
        printf("%s ", p);   

    printf("\n");
}

    从例1中就可以看出strtok函数的基本使用方法,输入一个字符串数组,然后就可以将其按照一定的分隔符(例1中为".")将一个长的字符串分割成一个个短的字符串。这里需要注意的是,在对一个长字符串分割的时候,第一次调用时,strtok函数的第一个参数传入要分割的字符串,而第二次以及后面再次调用该函数的时候,strtok函数的第一个参数应该传入NULL,这是因为在strtok第一个参数为NULL的时候,该函数默认使用上一次未分割完的字符串的未分割的起始位置作为本次分割的起始位置,直到分割结束为止。

    这个例子就最常见的基本应用,但是仅仅知道这些很容易忽略很多细节问题,后面本文将继续讨论一些值得注意的问题。

2. 使用注意事项1


    这里首先需要强调的是strtok函数在进行字符串分解的时候,其第一个参数,即char str[]是在变化的,就像前面说过的一样,其只是对源字符串动了一些手脚,也就是改变了源字符串。以例1中的字符串来说,"192.168.0.26"是源字符串,在调用strtok对其分解结束后,字符串变成了"19201680026",注意其中红色加粗部分是把'.'替换成了'\0',也就是替换成了字符串结束标志字符,这样在打印或使用的时候都会使得前面的字符串成为一个看起来独立的字符串,即"192"、"168"、"0"、"26",这些字符串还是在源字符串中,只是后面都有了自己的字符串结束标志'\0'而已。

3. 使用注意事项2


    在注意事项1中提到了源字符串发生了变化,同时注意到strtok函数原型的第一个参数是一个字符数组char str[],虽然说传递参数时实参可以是一个指针,但是这个指针如果是字符串常量指针,那么就会引起程序运行时崩溃,因为源字符串要发生变化,而字符串常量是不能被改变的,例如下面的例2就是错误的。

// 例2
#include <string.h>

void main()
{  
    char *s = "192.168.0.26";  // 与例1的唯一区别,字符串数组变成了字符串常量指针!!!
    char *delim = ".";  
    char *p;  
    printf("%s ", strtok(s, delim));  

    while((p = strtok(NULL, delim)))    
        printf("%s ", p);   

    printf("\n");
}

    所以如果输入是字符串常量指针的时候,是不能直接传递给strtok函数的第一个参数的,大家可以将这个字符串常量指针中的内容逐一拷贝到一个字符串数组中,再进行分解,不过这种方法效率比较低,所以并不建议这样使用,如果实在无法使用strtok函数进行字符串分解,那么可以使用其他的函数进行类似分解,比如使用strstr函数、strchr函数等。

4. 使用注意事项3


    对于strtok函数的第二个参数,即分隔符,要注意:包含在delim中的字符均可以作为分隔符,而非严格匹配。可以把delim理解为分隔符的集合。这一点是非常重要的!当然,我们在分解字符串的时候,很少使用多个分隔符。这也导致,很多人在写例子的时候只讨论了一个分隔符的情况。有更多的人在看例子的时候也就错误的认识了delim的作用。    

5. 使用注意事项4


    如果strtok函数要分解的字符串的首字符就是分隔符,那么strtok函数会忽略第一个字符,直接从下一个分隔符算起。比如:".192.168.0.26",那么第一个字符'.'就会被忽略,分解后的第一个字符串就是"192"。

    总之,strtok函数是一个看起来很简单,但是使用起来有很多需要注意的细节的函数,所以应该理解掌握,由于strtok函数并不是线程安全的,所以很多情况下并不再使用这个函数,而是由程序员实现自己的字符串分割函数,从而保证线程安全,不过,在Linux中定义了strtok_r函数,这个函数是strtok函数的线程安全版本,具体使用方法可以参考其他资料。

    如果大家还有别的意见,欢迎大家多多补充,谢谢。

    参考资料:

http://blog.csdn.net/helpxs/article/details/6958975
  • 66
    点赞
  • 209
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
strtok函数是C语言中的字符串处理函数,用于将字符串分割成多个子字符串。它的使用示例如下: ```c #include <stdio.h> #include <string.h> int main() { char str[] = "Hello,World,CSDN"; char *token; // 使用strtok函数分割字符串 token = strtok(str, ","); while (token != NULL) { printf("%s\n", token); token = strtok(NULL, ","); } return 0; } ``` 上述示例中,我们首先定义了一个字符串`str`,其中包含了多个子字符串,每个子字符串之间使用逗号进行分隔。然后,我们使用`strtok`函数字符串进行分割。 在第一次调用`strtok`时,我们将待分割字符串`str`作为第一个参数传入,并指定分隔符为逗号。`strtok`函数会返回第一个子字符串的指针,并将原字符串中的逗号替换为`\0`,以便后续的分割。 接着,我们使用一个循环来遍历所有的子字符串。在循环中,我们首先打印当前子字符串,然后再次调用`strtok`函数,传入`NULL`作为第一个参数。这样,`strtok`函数会继续从上一次分割的位置开始,找到下一个子字符串,并返回其指针。 当所有的子字符串都被遍历完毕后,`strtok`函数会返回`NULL`,循环结束。 注意:在使用`strtok`函数时,需要注意以下几点: 1. `strtok`函数会修改原字符串,将分隔符替换为`\0`,因此在使用字符串之前,需要先将其备份。 2. 在第一次调用`strtok`函数时,需要传入待分割字符串作为第一个参数;在后续的调用中,需要传入`NULL`作为第一个参数。 3. `strtok`函数返回的指针指向的是原字符串中的子字符串,因此不要尝试修改或释放这些指针。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值