2012-08-16 730 views
4

我看到一本書,這個源代碼:這些代碼是做什麼的?

#include <stdio.h> 
#include <unistd.h> 


int main(int argc, char *argv[]) 
{ 
    char *delivery = ""; 
    int thick = 0; 
    int count = 0; 
    char ch; 

    while ((ch = getopt(argc, argv, "d: t")) != EOF) 
     switch(ch) 
     { 
      case 'd': 
       delivery = optarg; 
       break; 

      case 't': 
       thick = 1; 
       break; 

      default: 
       fprintf(stderr, "Unknown option: '%s'\n", optarg); 
       return 1; 
     } 

     argc -= optind; 
     argv += optind; 

     if (thick) 
      puts("Thick Crust."); 

     if (delivery[0]) 
      printf("To be deliverd %s\n", delivery); 

     puts("Ingredients: "); 

     for (count = 0; count < argc; count++) 
      puts(argv[count]); 

    return 0; 
} 

我能明白,只是整個源:

argc -= optind; 
argv += optind; 

我知道什麼是argc和argv,但發生什麼事他們在這兩條線,什麼是「optind」 請解釋一下。

謝謝。

回答

4

getopt庫提供了幾個函數來幫助解析命令行參數。

當您調用getopt時,它會「吃」可變數量的參數(取決於命令行選項的類型);在「optind」全局變量中指出了「已吃」參數的數量。

您的代碼使用optind調整argvargc以跳過剛纔消耗的參數。

3

它是由getopt使用的全局變量。

從手冊:

的getopt()函數解析命令行參數。它的參數 argc和argv是在程序調用時傳遞給main() 函數的參數count和數組。

變量optind是argv中要處理的下一個元素 的索引。系統初始化該值設置爲1

這代碼只是更新argc和argv指向的剩餘參數(-選擇跳過)。

+0

您正在使用哪種手冊? – weston 2012-08-16 12:28:32

+0

getopt。 http://linux.die.net/man/3/getopt'man 3 getopt'。 – 2012-08-16 12:31:43

+0

或者,如果您安裝了正確的手冊頁,「man optind」會爲您提供相同的信息。 – 2012-08-16 12:32:39

2

關於如何:

OPTIND是將這個代碼後可以忽略的argv的元素的數目:

argc -= optind; // reduces the argument number by optind 
argv += optind; // changes the pointer to go optind items after the first one 

的argc(計數)由OPTIND

降低並且相應地升級指向argv的第一個元素的指針。

關於爲什麼:

見卡羅伊的答案。

0

同時運行此代碼,您可能會執行它./executable_file:name -d some_argument

當getopt的被稱爲它開始掃描什麼是寫在命令行。 argc = 3,argv [0] =。/ executable_file:name argv [1] = - d argv [2] = some_argument。 getopt將得到那個時間optind = 2的選項d,它是下一個即argv [2]的索引。 因此optind + argv會指向argv [2]。

一般而言,optind將具有下一個的索引。