命令參數處理

命令參數處理

在很多時候我們都會寫一下帶有命令及其參數處理的程序。比如說在模擬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 後我們就可以得到字符串中對應位置的一段的有用信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章