C語言切割字串函式 strsep,分析 URL GET 參數
来源:互联网 发布:python get text 编辑:程序博客网 时间:2024/06/05 15:28
今天來簡介 UNIX 內建的 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 指標。看上面文字敘述,好像不太瞭解,沒關係,底下是 UNIX strsep.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 more tokens).
*
* If *stringp is NULL, strsep returns NULL.
*/
char *
strsep(stringp, delim)
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 */
}
底下來分析 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 individual assignments */
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[string len] : %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[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
- C語言切割字串函式 strsep,分析 URL GET 參數
- strsep源码分析
- strsep
- strsep
- strsep
- strsep
- strsep 函数 c 语言 实现
- C 拆分字符串(strtok,strsep)
- C语言 strsep函数实现
- 《c和指针》笔记--strsep淘汰strtok
- strsep使用,C语言截取字符串
- Problem C: 01字串
- 问题 C: 01字串
- Problem C: 01字串
- Problem C: 01字串
- 字串核对(c/python)
- C++:求最大字串
- [C]切割字符串
- 【转】获取行业资讯的十大方法
- Flash底层显示
- Vim:打造Linux C/C++程序员的编辑器
- Delphi 中线程的初级学习
- 在eclipse中安装jbpm插件
- C語言切割字串函式 strsep,分析 URL GET 參數
- Socket send函数和recv函数详解
- Java 开发员AJAX 常见问题
- 第一篇博客 以后会常常来更新 作为学习的轨迹
- WaitForSingleObject使用
- struts+SmartUpload实现的一个简易上传下载系统
- 精讲c++中的const
- 总是被低级错误打倒
- 解读linux对string.h函数的实现