argv傳入資料處理

當一個程式在呼叫的時候可能會傳入參數讓它做處理,而處理就是透過main()的兩個參數來處理,這邊我們來討論一個很有效用的用法,基本的用法,書上都有寫了。

※ argv與argc

如果要透過執行程式的時候傳入參數的話,那麼要使用int main(int argc, char** argv)我相信這大家都已經用到爛掉了,而argc是記錄有幾個參數,而argv則是指向字串陣列的一個指標,而我們的參數都在argv裡面,所以我們要透過一個方法來處理我們輸入的資料要為程式帶來什麼改變。

※ 使用二元處理or與and來處理選項

我們透過or(|)的運算,可以把某個bit設定為1而and(&)則可以把某個bit遮罩出來,是否為真,因此如下面範例。

Example:

#define NUME 1
#define DESC 2

int option = 0;

while (- -argc > 0 && (*++argv)[0] == '-')
{
char* ptr = *argv; //指向目前列的起啟位子
char c;
while ((c = *++ptr))
{
switch (c)
{
case 'n':
option |= NUME;
break;
case 'r':
option |= DESC;
break;
default:
printf("unknow %c", c);
exit(1);
break;
}
}
}
if (option & NUME)
//do some thing
if (option & DESC)
//do some thing

我想一開始為什麼會定義NUME 1和DESC 2呢?一定覺得很奇怪因為我們要讓它的二元為0001而DESC為0010那如果還有一個選項的話阿以定為4那就是0100而把option設為0000如果那個選項要開啟的話把它做 or(|)的運算就行了,如:

* option |= NUME -> 0001
* option |= DESC -> 0011

而我們透過遮罩運算,就可以找出是否已被設定為功能開啟,比如說目前的option為2好了

* option & NUME -> 0010 & 0001 = 0000 (false)
* option & DESC -> 0010 & 0010 = 0010 (true)

如此我們就可以用if來判斷是不是為真來執行我們所要的功能了,這是非常的方便的。

0 意見: