strtok函数的使用注意事项

andychen1 andychen1     2022-10-12     136

关键词:

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

 
    strtok函数是用来分解字符串的,其原型是:
 
[cpp] view plain copy
 
  1. char *strtok(char str[], const char *delim);  

    其中str是要分解的字符串,delim是字符串中用来分解的字符,该函数返回分解后的字符串的起始位置指针。之所以是分解,就是说并没有生成新的字符串,只是在源字符串上面做了一些手脚,使得源字符串发生了变化,所以一定要注意,源字符串发生了变化!!!
 
    先从最简单的应用来看,看下面的例1。
 
[cpp] view plain copy
 
  1. // 例1  
  2. #include <string.h>  
  3.   
  4. void main()  
  5. {    
  6.     char s[] = "192.168.0.26";    
  7.     char *delim = ".";    
  8.     char *p;    
  9.     printf("%s ", strtok(s, delim));    
  10.   
  11.     while((p = strtok(NULL, delim)))      
  12.         printf("%s ", p);     
  13.   
  14.     printf(" ");  
  15. }  

    从例1中就可以看出strtok函数的基本使用方法,输入一个字符串数组,然后就可以将其按照一定的分隔符(例1中为".")将一个长的字符串分割成一个个短的字符串。这里需要注意的是,在对一个长字符串分割的时候,第一次调用时,strtok函数的第一个参数传入要分割的字符串,而第二次以及后面再次调用该函数的时候,strtok函数的第一个参数应该传入NULL,这是因为在strtok第一个参数为NULL的时候,该函数默认使用上一次未分割完的字符串的未分割的起始位置作为本次分割的起始位置,直到分割结束为止。
 
    这个例子就最常见的基本应用,但是仅仅知道这些很容易忽略很多细节问题,后面本文将继续讨论一些值得注意的问题。
 

2. 使用注意事项1

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

3. 使用注意事项2

 
    在注意事项1中提到了源字符串发生了变化,同时注意到strtok函数原型的第一个参数是一个字符数组char str[],虽然说传递参数时实参可以是一个指针,但是这个指针如果是字符串常量指针,那么就会引起程序运行时崩溃,因为源字符串要发生变化,而字符串常量是不能被改变的,例如下面的例2就是错误的。
 
[cpp] view plain copy
 
  1. // 例2  
  2. #include <string.h>  
  3.   
  4. void main()  
  5. {    
  6.     char *s = "192.168.0.26";  // 与例1的唯一区别,字符串数组变成了字符串常量指针!!!  
  7.     char *delim = ".";    
  8.     char *p;    
  9.     printf("%s ", strtok(s, delim));    
  10.   
  11.     while((p = strtok(NULL, delim)))      
  12.         printf("%s ", p);     
  13.   
  14.     printf(" ");  
  15. }  

    所以如果输入是字符串常量指针的时候,是不能直接传递给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函数的线程安全版本,具体使用方法可以参考其他资料。

函数内部还是不要使用strtok()

...个小时没找到原因。在吃饭的时候,突然想起可能是 strtok()引起的,查找调用的函数,果然发现在函数中使用了 strtok()。而现在的问题就是在另一段代码中先使用了 strtok(),然后在没有结束前,又调用了一个内部使用&n... 查看详情

关于函数strtok和strtok_r的使用要点和实现原理

本文转载自:http://astute11.blog.51cto.com/4404646/1334198strtok函数的使用是一个老生常谈的问题了。该函数的作用很大,争议也很大。以下的表述可能与一些资料有区别或者说与你原来的认识有差异,因此,我尽量以实验为证。交代一... 查看详情

为啥当我使用不同版本的 GCC 时使用 strtok 函数时出现此错误?

】为啥当我使用不同版本的GCC时使用strtok函数时出现此错误?【英文标题】:WhyisthiserroronusingstrtokfunctionshowingwhenIuseadifferentversionofGCC?为什么当我使用不同版本的GCC时使用strtok函数时出现此错误?【发布时间】:2020-08-2823:56:54【... 查看详情

strtok() 可以安全使用吗?

】strtok()可以安全使用吗?【英文标题】:Isstrtok()safetouse[duplicate]【发布时间】:2015-06-0109:50:45【问题描述】:我正在阅读很多关于strtok()的负面信息,有人说它已经过时,有人说它不是线程安全的,等等。那么真相是什么,我... 查看详情

strtok的使用(代码片段)

/*strtok函数的使用*/#include<stdio.h>#include<stdlib.h>#include<string.h>//函数原型://char*strtok(char*str,constchar*delim)//参数://str--要被分解成一组小字符串的字符串//delim--包含分隔符的C字符串//返回值//该函数返回被分解的第一... 查看详情

c语言最短时间带你实现strtok,字符串分割函数,建议收藏!!!(代码片段)

strtok前言一、strtok的基本使用二、strtok的实现总结↗️↗️↗️建议三连,以防丢失前言字符串分割函数strtok,大家可能都知道他怎么使用,一旦要用的时候就会心生疑惑,不知道它的内部的实现,废话不多... 查看详情

strtok函数

strtok函数是cstring文件里的函数strtok函数是cstring文件里的函数其功能是截断字符串原型为:char*strtok(chars[],constchar*delin);s[]是要截断的字符串,delin是用来截断的字符串。每次调用成功后则返回切割出片段的指针。比如,strtok("aa... 查看详情

使用strtok从字符串中解析空标记(代码片段)

...解析为单个值。2342|2sd45|dswer|2342||5523|||3654|Pswt我正在使用strtok循环执行此操作。对于第五个标记,我得到5523.但是,我需要考虑两个分隔符||之间的空值。根据我的要求,5523应该是第六个令牌。token=(char*)strtok(strAccInfo,"|");for(iLoop=... 查看详情

strtok()出现segmentfault的错误(代码片段)

...的命令通过空格分割成一个个字符串参数,这里我使用了strtok()函数,然后遇到了segmentfault的错误。出现问题的代码如下:终于寻找到原因:strtok(char*string,char*delim)函数的实现逻辑是函数是在s中查找包含在delim中的字符并用NULL(... 查看详情

strtok()函数

strtok()这个函数大家都应该碰到过,但好像总有些问题, 这里着重讲下它首先看下MSDN上的解释:char*strtok(char*strToken,constchar*strDelimit);ParametersstrTokenStringcontainingtokenortokens.strDelimitSetofdelimitercharacters.ReturnValueRe 查看详情

strtok()函数(代码片段)

说明(1)当strtok()在参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为 查看详情

到处是“坑”的strtok()—解读strtok()的隐含特性(代码片段)

在用C/C++实现字符串处理逻辑时,strtok函数的使用非常广泛,其主要作用是按照给定的字符集分隔字符串,并返回各子字符串。由于该函数的使用有诸多限制,如果使用不当就会造成很多“坑”,因此本... 查看详情

strtok函数

1#include<stdio.h>2#include<string.h>34intmain()5{6chara[100]="aa_vfb_wffwk_fth_nnn";7char*s;//定义一个char的指针变量8s=strtok(a,"_");//strtok函数分割字符串910while(s)11{12printf("%s ",s);13s=strtok(NULL 查看详情

字符串分割函数strtok(线程不安全),线程安全函数strtok_r

strtok_r函数---字符串分割函数函数原型:    char*strtok_r(char*str,constchar*delim,char**saveptr);参数:str:被分割的字符串,若str为NULL,则被分割的字符串为*saveptrdelim:依据此字符串分割strsaveptr:分割后剩余部分的字符串... 查看详情

strtok函数怎么用啊?

...考技术A其实你输入的是一个字符串,然后程序对输入用strtok解析得到各个坐标对字符串src="n1,n2,n3,n4"的解析如下char*p;intx1,x2,y1.y2;p=strtok(src,",");x1=atoi(p);p=strtok(NULL,",");x2=atoi(p);p=strtok(NULL,",");y1=atoi(p);p=... 查看详情

c语言的split字符串分割(函数strtok)(代码片段)

1、说明:在C语言中实现对字符串的分割(多亏了strtok函数)2、案例讲解1、Strtok()函数详解:该函数包含在"string.h"头文件中1)函数原型:char*strtok(char*str,constchar*delimiters);2)函数功能:切割... 查看详情

字符串库函数及重点函数的模拟实现下篇---strstr+strtok+strerror(代码片段)

本文重点8.strstr9.strtok10.strerror本文将继续介绍字符串库函数,即重点函数的模拟实现。正文开始@边通书8.strstr💛字符串查找函数—在一个字符串中,查找子字符串strstr的使用:😇strstr的模拟实现my_strlenÿ... 查看详情

strtok—标记分割字符串

 说明strtok(string$str,string$token):stringstrtok(string$token):stringstrtok()将字符串str分割为若干子字符串,每个子字符串以token中的字符分割。这也就意味着,如果有个字符串是"Thisisanexamplestring",你可以使用空格字符将这句话分割成独... 查看详情