标题：strsep
原型
原型：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);
}
strsep函数，这在 Windows Dev-C++ 是没有支持的，在写 UNIX 分析字符串常常需要利用到此函式，大家可以 man strsep来看如何使用 strsep，假设我们要分析 URL Get 字符串：user_command=appleboy&test=1&test2=2，就可以利用两次 strsep 函式，将字符串全部分离，取的个别的 name,value。strsep(stringp,delim) 第一个参数传入需要分析的字符串，第二个参数传入 delim 符号，假设 stringp 为 NULL 字符串，则函式会回传 NULL，换句话说，strsep 会找到 stringp 字符串第一个出现 delim 符号，并将其取代为 \0 符号，然后将 stringp 更新指向到 \0 符号的下一个字符串，strsep() function 回传原来的 stringp 指标。看上面文字叙述，好像不太了解，没关系，底下是 UNIXstrsep.c 的原始码：
/*
* Get next token from string *stringp, where tokens are possibly-empty
* strings separated by characters from delim.
*
* Writes NULs into the string at *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, const 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 就回传 NULL，接下来进行每一个字的比对，如果发现到有 delim，如果是在字符串结尾符号 \0，则将字符串设定为 NULL 并且更新 stringp，如果并非字符串结尾，就将字符串(s)往前一个(delim 符号)，并且将其改变为 \0 分割点，且更新 *stringp 指向 delim 符号下一个字，回传初始字符串。
示例
底下来分析 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