命令參數處理
在很多時候我們都會寫一下帶有命令及其參數處理的程序。比如說在模擬shell的實驗中,處理我們輸入的各種命令,輸入"ls -al *.c", 結果應該是輸出當前目錄下的所有.c文件的詳細信息。我們需要做到就是提取出這段字符串中的有用信息,人們都能想到的一種做法是遍歷一遍字符串,去掉空白字符,將有用的命令和參數存入相應的位置,問題很簡單關鍵就是看你這裏怎麼寫。
當然類似的問題也可以使用正則表達式來做,但這不是這裏要說的內容。這裏要說的是我在閱讀pachi源碼中發現作者使用的一種方法。
代碼
#include<stdio.h>
#include<string.h>
int main () {
#define next_tok(to_) \
to_ = next; \
next = next + strcspn(next, " \t\r\n"); \
if (*next) { \
*next = 0; next++; \
next += strspn(next, " \t\r\n"); \
}
char str[100] = "bb 19 he";
char *cmd, *next = str;
next_tok(cmd);
printf("%s\n", cmd);
next_tok(cmd);
printf("%s\n", cmd);
next_tok(cmd);
printf("%s\n", cmd);
#undef next_tork
return 0;
}
輸出結果爲:
bb
19
he
其中有兩個函數 strcspn() 和 strspn() 百度說明如下:
size_t strcspn(const char *s, const char * reject);
從參數s 字符串的開頭計算連續的字符,而這些字符都完全不在參數reject 所指的字符串中。簡單地說, 若strcspn()返回的數值爲n,則代表字符串s 開頭連續有n 個字符都不含字符串reject 內的字符。
size_t strspn (const char *s,const char * accept);
從參數s 字符串的開頭計算連續的字符,而這些字符都完全是accept 所指字符串中的字符。簡單的說,若strspn()返回的數值爲n,則代表字符串s 開頭連續有n 個字符都是屬於字符串accept內的字符。
在這段代碼中,strcspn() 統計第一次出現的空白字符前的字符數量 ,strspn() 統計第一次出現的非空白字符前的字符數量,很顯然這樣做的目的是跳過字符串中的空白字符。
每次使用 next_tok 後我們就可以得到字符串中對應位置的一段的有用信息。