原型:char *strsep(char **stringp, const char *delim);
功能:分解字符串为一组字符串。从stringp指向的位置起向后扫描,遇到delim指向的字符串中的字符后,将此字符替换为NULL,返回stringp指向的地址。它适用于分割“关键字”在两个字符串之间只“严格出现一次”的情况。[1]如果“关键字”在字符串之间连续出现,可使用如下技巧解决:
char str[] = "abcdefg";
char *p = str,key_point;
while(1)
{
while ( key_point = strsep(&p,"cd"))//关键字为c或d,它们连续出现了
{
//函数遇到c时,key_point指向a返回,遇到d时key_point指向d返回(注意此时d已经被改写为\0了)
if (*key_point == 0)
continue;//遇到连续的关键字,返回一个指向\0的指针,继续往后找就是
else
break;//分割出一个正常的字符串,快去打印吧!
}
printf("%s\n",key_point);
}
分析username=appleboy&password=1234&action=delete字符串,程序代码如下:/*
*
* 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(stderr, "CGI[query string] :%s\n",query);
len = strlen(query);
nel = 1;
while (strsep(&q, "&"))
nel++;
fprintf(stderr, "CGI[nel string] : %d\n", nel);
for (q = query; q< (query + len);) {
value = name = q;
/* Skip to next assignment */
fprintf(stderr, "CGI[string] :%s\n", q);
fprintf(stderr, "CGI[stringlen] : %d\n",strlen(q));
fprintf(stderr, "CGI[address] :%x\n", q);
for (q += strlen(q); q < (query +len) &&!*q; q++);
/* Assign variable */
name = strsep(&value,"=");
fprintf(stderr, "CGI[name ] :%s\n", name);
fprintf(stderr, "CGI[value] :%s\n", value);
}
return 0;
}
里面大家可以看一下 while (strsep(&q,“&”)) 这边,这是利用 & 符号切割字符串,并且算出有几个符合,底下再把 q 重新指向 query,跑 for 循环,要小于字符串长度,由于已经经过一次 strsep 函式,所以全部的 & 符号都取代成 \0,整体字符串变成user_command=appleboy\0test=1\0test2=2,故执行到 for (q += strlen(q); q < (query + len)&& !*q; q++);,会将 q 指标指向 test=1 的 t 字母,底下在 name = strsep(&value,“=”); 将原本的user_command=appleboy分割,所以 name 输出 user_command,value 输出 appleboy,大致上是这样。
输出结果:
CGI[query string]:user_command=appleboy&test=1&test2=2
CGI[nel string] : 4
CGI[string] : user_command=appleboy
CGI[string len] : 21
CGI[address] : bfb537b0
CGI[name ] : user_command
CGI[value] : appleboy
CGI[string] : test=1
CGI[string len] : 6
CGI[address] : bfb537c6
CGI[name ] : test
CGI[value] : 1
CGI[string] : test2=2
CGI[string len] : 7
CGI[address] : bfb537cd
CGI[name ] : test2
CGI[value] : 2
示例二:
#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 = strsep(&buf, ":")) !=NULL){
printf("%s\n", token);
}
return 0;
}
再一个示例程序:
#include <stdio.h>
#include <string.h>
void main()
{
char str[]="Number=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&maxMtu=200"
value=strsep(&next,"&"); // 这时通过"&"分割字符串,返回值为100,next指 向"maxMtu=200"
printf(" name= %s\n",name); //打印出一轮分割后name的值
printf("value= %s\n",value);
value=next;
}
}
执行结果为:
name= Number
value= 100
name= maxMtu
value= 200