strtok与strsep函数说明_第1页
strtok与strsep函数说明_第2页
strtok与strsep函数说明_第3页
strtok与strsep函数说明_第4页
strtok与strsep函数说明_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、strsepstrsep函数用于分解字符串为一组字符串。定义语句为char *strsep(char *stringp, const char *delim);定义strsep函数char *strsep(char *stringp, const char *delim);例二#include <stdio.h>#include <string.h>int main(void)char str = "root:x:0:root:/root:/bin/bash:"char *buf;char *token;buf = str;while(token =

2、 strsep(&buf, ":") != NULL)printf("%sn", token);return 0;功能及作用分解字符串为一组字符串。从stringp指向的位置起向后扫描,遇到delim指向的字符串中的字符后,将此字符替换为NULL,返回stringp指向的地址。它适用于分割“关键字”在两个字符串之间只“严格出现一次”的情况。1 如果“关键字”在字符串之间连续出现,可使用如下技巧解决:char str = "abcdefg"char *p = str;char *key_point;while(p)while (

3、 key_point = strsep(&p,"cd")/关键字为c或d,它们连续出现了/函数遇到c时,key_point指向c返回,遇到d时key_point指向d返回(注意此时d已经被改写为'0'了)if (*key_point = 0)continue;/遇到连续的关键字,返回一个指向0的指针,继续往后找就是elsebreak;/分割出一个正常的字符串,快去打印吧!printf("%sn",key_point);strsep函数,这在 Windows Dev-C+ 是没有支持的,在写UNIX分析字符串常常需要利用到此函式,大

4、家可以 man strsep来看如何使用 strsep,假设我们要分析URLGet 字符串:user_command=appleboy&test=1&test2=2,就可以利用两次 strsep 函式,将字符串全部分离,取的个别的 name,value。strsep(stringp,delim) 第一个参数传入需要分析的字符串,第二个参数传入 delim 符号,假设 stringp 为 NULL 字符串,则函式会回传 NULL,换句话说,strsep 会找到 stringp 字符串第一个出现 delim 符号,并将其取代为 0 符号,然后将 stringp 更新指向到 0 符号

5、的下一个字符串,strsep() function 回传原来的 stringp 指标。看上面文字叙述,好像不太了解,没关系,底下是 UNIXstrsep.c 的原始码:1234567891011121314151617181920212223242526272829303132333435/* * Get next token from string *stringp, where tokens are possibly-empty * strings separated by characters from delim. * * Writes NULs into the string at

6、*stringp to end tokens. * delim need not remain constant from call to call. * On return, *stringp points past the last NUL written (if there might * be further tokens), or is NULL (if there are definitely no moretokens). * * If *stringp is NULL, strsep returns NULL. */char *strsep(char *stringp, con

7、st char *delim) char *s; const char *spanp; int c, sc; char *tok; if (s = *stringp)= NULL) return (NULL); for (tok = s;) c = *s+; spanp = delim; do if (sc =*spanp+) = c) if (c = 0) s = NULL; else s-1 = 0; *stringp = s; return (tok); while (sc != 0); /* NOTREACHED */上面程序代码可以看到 stringp 如果为 NULL 就回传 NU

8、LL,接下来进行每一个字的比对,如果发现到有 delim,如果是在字符串结尾符号 0,则将字符串设定为 NULL 并且更新 stringp,如果并非字符串结尾,就将字符串(s)往前一个(delim 符号),并且将其改变为 0 分割点,且更新 *stringp 指向 delim 符号下一个字,回传初始字符串。示例例一底下来分析 username=appleboy&password=1234&action=delete字符串,程序代码如下:123456789101112131415161718192021222324252627282930313233343536373839404

9、14243444546474849505152535455565758596061626364656667/* * * Author : appleboy * Date : 2010.04.27 * Filename : strsep.c * */ int main() int len, nel; char query ="user_command=appleboy&test=1&test2=2" char *q, *name, *value; /* Parse into individualassignments */ q = query; fprintf

10、(stderr, "CGIquery string : %sn",query); len = strlen(query); nel = 1; while (strsep(&q, "&") nel+; fprintf(stderr, "CGInel string : %dn", nel); for (q = query; q< (query + len);) value = name = q; /* Skip to next assignment */ fprintf(stderr, "CGIstring

11、 :%sn", q); fprintf(stderr, "CGIstringlen : %dn", strlen(q); fprintf(stderr, "CGIaddress :%xn", q); for (q += strlen(q); q < (query +len) && !*q; q+); /* Assign variable */ name = strsep(&value,"="); fprintf(stderr, "CGIname :%sn", name); f

12、printf(stderr, "CGIvalue :%sn", value); return 0; 里面大家可以看一下 while (strsep(&q,“&”) 这边,这是利用 & 符号切割字符串,并且算出有几个符合,底下再把 q 重新指向 query,跑 for 循环,要小于字符串长度,由于已经经过一次 strsep 函式,所以全部的 & 符号都取代成 0,整体字符串变成user_command=appleboy0test=10test2=2,故执行到 for (q += strlen(q); q < (query + len)&a

13、mp;& !*q; q+);,会将 q 指标指向 test=1 的 t 字母,底下在 name = strsep(&value,“=”); 将原本的user_command=appleboy 分割,所以 name 输出 user_command,value 输出 appleboy,大致上是这样。输出结果:CGIquery string :user_command=appleboy&test=1&test2=2CGInel string : 4CGIstring : user_command=appleboyCGIstring len : 21CGIaddress

14、 : bfb537b0CGIname : user_commandCGIvalue : appleboyCGIstring : test=1CGIstring len : 6CGIaddress : bfb537c6CGIname : testCGIvalue : 1CGIstring : test2=2CGIstring len : 7CGIaddress : bfb537cdCGIname : test2CGIvalue : 2例三#include <stdio.h>#include <string.h>void main()char str="Numbe

15、r=100&maxMtu=200"char *name,*value,*next;int i;value=str; /使指针value 指向字符串str;for(i=0 ;i<2 ;i+) / 第一次执行时name = strsep(&value,"="); / 以"="分割字符串,这时strsep函数返回值为 "Number",即"="号之前的字符串next =value; / 这时指针value指向"="号后面的字符串,即"100&maxMt

16、u=200"value=strsep(&next,"&"); / 这时通过"&"分割字符串,返回值为100,next指 向"maxMtu=200"printf(" name= %sn",name); /打印出一轮分割后name的值printf("value= %sn",value);value=next;执行结果为:name= Numbervalue= 100name= maxMtuvalue= 200strtok分解字符串为一组字符串。s为要分解的字符,del

17、im为分隔符字符(如果传入字符串,则以首字符为分割标准)。首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。原型char *strtok(char s, const char *delim);功能分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。例如:strtok("abc,def,ghi",","),最后可以分割成为abc def ghi.尤其在点分十进制的IP中提取应用较多。说明strtok()用来将字符串分割成一个个片段。参数s指向欲分割的字符串,参数delim则为分割字符串中包含的所有字符。当strtok()在

18、参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为0 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回指向被分割出片段的指针。返回值从s开头开始的一个个被分割的串。当查找不到delim中的字符时,返回NULL。所有delim中包含的字符都会被滤掉,并将被滤掉的地方设为一处分割的节点。使用strtok函数会破坏被分解字符串的完整,调用前和调用后的s已经不一样了。如果要保持原字符串的完整,可以使用strchr和sscanf的组合等。c12345678910111213141516171819#include<

19、;string.h>#include<stdio.h>int main(void) char input16="abc,d" char*p; /*strtok places a NULL terminator infront of the token,if found*/ p=strtok(input,","); if(p) printf("%sn",p); /*Asecond call to strtok using a NULL as the first parameter returns a pointer t

20、o the character following the token*/ p=strtok(NULL,","); if(p) printf("%sn",p); return 0;c+123456789101112131415#include<iostream>#include<cstring>using namespace std;int main() char sentence="This is a sentence with 7 tokens" cout << "The string

21、 to be tokenized is:n" << sentence << "nnThe tokens are:nn" char *tokenPtr=strtok(sentence,""); while(tokenPtr!=NULL) cout<<tokenPtr<<'n' tokenPtr=strtok(NULL,""); /cout << "After strtok,sentence=" << tokenPtr<<endl; return 0;函数第一次调用需设置两个参数。第一次分割的结果,返回串中第一个 ',' 之前的字符串,也就是上面的程序第一次输出abc。第二次调用该函数strtok(NULL,","),第一个参数设置为NULL。结果返回分割依据后面的字串,即第二次输出d。strtok是一个线程不安全的函数,因为它使用了静态分配的空间来存储被分割的字符串位置线程安全的函数叫strtok_r,ca运用strtok来判断ip或者mac的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论