C语言。运用strtok r函数函数使字符串倒叙输出的。程序应该没问题。不理解写的reverse函数啥意思。可以解释下吗

strtok函数解析-c/c++-电脑编程网strtok函数解析作者:佚名 和相关&&

型:char *strtok(char *s, char *delim);功能:分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。说明:首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。&&&& strtok在s中查找包含在delim中的字符并用NULL('\0')来替换,直到找遍整个字符串。返回值:从s开头开始的一个个被分割的串。当没有被分割的串时则返回
NULL。&&&&& 所有delim中包含的字符都会被滤掉,并将被滤掉的地方设为一处分割的节点。缺点:将原始字符串强制修改,这是我们不愿意看到的,所以,如果使用该函数的话,需要将其备份。
#include &stdio.h&#include &string.h&int main(void){&& &char buf[] = "ls&&&&& -a&&&& -l";&& &char *delim = " ";&& &char *retptr = NULL;&& &char *str =&& &printf("原始字符串:%s\n", buf);&& &printf("分割字符串如下:\n");&& &while(1) {&& &&&& retptr = strtok(str, delim);&& &&&& if (retptr) {&& &&&& &&& printf("%s\n", retptr);&& &&&& }&& &&&& else&& &&&& &&&&& &&&& str = NULL;&& &}&& &printf("分割后原字符串已被强制修改为:%s\n", buf);&& &return 0;}运行结果:原始字符串:ls&&&&& -a&&&& -l分割字符串如下:ls-a-l分割后原字符串已被强制修改为:ls相关资料:|||||||strtok函数解析来源网络,如有侵权请告知,即处理!编程Tags:                &                    > 字符串函数strtok
字符串函数strtok
  原型:extern char *strtok(char *s, char *delim);  用法:#include &string.h&  功能:分解字符串为一组标记串。s为要分解的字符串,delim为分隔符字符串。  说明:首次调用时,s必须指向要分解的字符串,随后调用要把s设成NULL。  strtok在s中查找包含在delim中的字符并用NULL(''
本文地址 :
------分隔线----------------------------C语言切割多层字符串(strtok_r strtok使用方法)
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了C语言切割多层字符串的方法,说了strtok的弱点,使用strtok_r的方法
1. strtok介绍
众所周知,strtok可以根据用户所提供的分割符(同时分隔符也可以为复数比如“,。”)将一段字符串分割直到遇到"\0".
比如,分隔符=“,” 字符串=“Fred,John,Ann”
通过strtok 就可以把3个字符串 “Fred”&&&&& “John”&&&&&& “Ann”提取出来。
上面的C代码为
代码如下:int in=0;char buffer[]="Fred,John,Ann"char *p[3];char *buff =while((p[in]=strtok(buf,","))!=NULL) {i++;buf=NULL; }
如上代码,第一次执行strtok需要以目标字符串的地址为第一参数(buf=buffer),之后strtok需要以NULL为第一参数 (buf=NULL)。指针列p[],则储存了分割后的结果,p[0]="John",p[1]="John",p[2]="Ann",而buf就变 成&&& Fred\0John\0Ann\0。
2. strtok的弱点让我们更改一下我们的计划:我们有一段字符串 "Fred male 25,John male 62,Anna female 16" 我们希望把这个字符串整理输入到一个struct,
代码如下:struct person { char [25] char [6]char [4]}
要做到这个,其中一个方法就是先提取一段被“,”分割的字符串,然后再将其以“ ”(空格)分割。比如: 截取 "Fred male 25" 然后分割成 "Fred" "male" "25"以下我写了个小程序去表现这个过程:
代码如下:#include&stdio.h&#include&string.h&#define INFO_MAX_SZ 255int main(){int in=0;char buffer[INFO_MAX_SZ]="Fred male 25,John male 62,Anna female 16";char *p[20];char *buf=while((p[in]=strtok(buf,","))!=NULL) {buf=p[in];while((p[in]=strtok(buf," "))!=NULL) {in++;buf=NULL;}p[in++]="***"; //表现分割buf=NULL; }printf("Here we have %d strings\n",in);for (int j=0; j& j++)printf("&%s&\n",p[j]);return 0;}
这个程序输出为:Here we have 4 strings&Fred&&male&&25&&***&这只是一小段的数据,并不是我们需要的。但这是为什么呢? 这是因为strtok使用一个static(静态)指针来操作数据,让我来分析一下以上代码的运行过程:
红色为strtok的内置指针指向的位置,蓝色为strtok对字符串的修改
1."Fred male 25,John male 62,Anna female 16" //外循环
2."Fred male 25\0John male 62,Anna female 16" //进入内循环
3."Fred\0male 25\0John male 62,Anna female 16"
4."Fred\0male\025\0John male 62,Anna female 16"
5 "Fred\0male\025\0John male 62,Anna female 16" //内循环遇到"\0"回到外循环
6&"Fred\0male\025\0John male 62,Anna female 16" //外循环遇到"\0"运行结束。
3. 使用strtok_r在这种情况我们应该使用strtok_r, strtok reentrant. char *strtok_r(char *s, const char *delim, char **ptrptr);
相对strtok我们需要为strtok提供一个指针来操作,而不是像strtok使用配套的指针。代码:
代码如下:#include&stdio.h&#include&string.h&#define INFO_MAX_SZ 255int main(){int in=0;char buffer[INFO_MAX_SZ]="Fred male 25,John male 62,Anna female 16";char *p[20];char *buf=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& j++)printf("&%s&\n",p[j]);return 0;}
这一次的输出为:Here we have 12 strings&Fred&&male&&25&&***&&John&&male&&62&&***&&Anna&&female&&16&&***&
让我来分析一下以上代码的运行过程:
红色为strtok_r的outer_ptr指向的位置,紫色为strtok_r的inner_ptr指向的位置,蓝色为strtok对字符串的修改
1. "Fred male 25,John male 62,Anna female 16" //外循环2. "Fred male 25\0John male 62,Anna female 16"//进入内循环3.&& "Fred\0male 25\0John male 62,Anna female 16"4&& "Fred\0male\025\0John male 62,Anna female 16"5 "Fred\0male\025\0John male 62,Anna female 16" //内循环遇到"\0"回到外循环6&& "Fred\0male\025\0John male 62\0Anna female 16"//进入内循环
原来, 该函数修改了原串.
所以,当使用char *test2 = "feng,ke,wei"作为第一个参数传入时,在位置①处, 由于test2指向的内容保存在文字常量区,该区的内容是不能修改的,所以会出现内存错误. 而char test1[] = "feng,ke,wei" 中的test1指向的内容是保存在栈区的,所以可以修改
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具strtok函数的妙用,分割字符串-中国学网-中国IT综合门户网站-提供健康,养生,留学,移民,创业,汽车等信息
strtok函数的妙用,分割字符串
来源:互联网 更新时间: 22:46:13 责任编辑:李志喜字体:
strtok分割字符串函数,很好的解决了字符分割的要求,不必遍历取关键字再区后面字符
这样字符串中查找关键值获取后面的东西就方便多了
#include &string.h&
//加啊如头文件
char * strtok ( char * str, const char * delimiters );
str&& ::&&& 第一次操作时原始字符串,当strtok分割一次成功后 ,设置为& NULL 继续扫描下面的字符 知道为空
delimiters
分割的中间值如 xiaowan#xiaoli 符号#
简单的例子如下
/* strtok example */
#include &stdio.h&
#include &string.h&
int main ()
char str[] =&- This, a sample string.&;
printf (&Splitting string \&%s\& into tokens:\n&,str);
pch = strtok (str,& ,.-&);
while (pch != NULL)
printf (&%s\n&,pch);
pch = strtok (NULL, & ,.-&);// 此处上面以成功一次 ,设置为空,继续扫描
Splitting string &- This, a sample string.& into tokens:
根据结果分析得出
字符串呗 .& ,-&这三个字符分割了
Return Value
If a token is found, a pointer to the beginning of the token.
Otherwise, a&null pointer.
A&null pointer&is always returned when the end of the string (i.e., a null character) is reached in the string being scanned.
相关文章:
上一篇文章:下一篇文章:
最新添加资讯
24小时热门资讯
Copyright © 2004- All Rights Reserved. 中国学网 版权所有
京ICP备号-1 京公网安备02号}

我要回帖

更多关于 strtok函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信