字符串分割 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);

  }



分析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


你可能感兴趣的:(字符串分割 strsep 函数)