2011-01-25 34 views
17

我讀過a getopt() example但它並沒有說明如何接受整數作爲參數的選項,比如cvalue將是從示例代碼:如何將整數作爲命令行參數?

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

int 
main (int argc, char **argv) 
{ 
    int aflag = 0; 
    int bflag = 0; 
    char *cvalue = NULL; 
    int index; 
    int c; 

    opterr = 0; 

    while ((c = getopt (argc, argv, "abc:")) != -1) 
    switch (c) 
     { 
     case 'a': 
     aflag = 1; 
     break; 
     case 'b': 
     bflag = 1; 
     break; 
     case 'c': 
     cvalue = optarg; 
     break; 
     case '?': 
     if (optopt == 'c') 
      fprintf (stderr, "Option -%c requires an argument.\n", optopt); 
     else if (isprint (optopt)) 
      fprintf (stderr, "Unknown option `-%c'.\n", optopt); 
     else 
      fprintf (stderr, 
        "Unknown option character `\\x%x'.\n", 
        optopt); 
     return 1; 
     default: 
     abort(); 
     } 

    printf ("aflag = %d, bflag = %d, cvalue = %s\n", 
      aflag, bflag, cvalue); 

    for (index = optind; index < argc; index++) 
    printf ("Non-option argument %s\n", argv[index]); 
    return 0; 
} 

如果我跑了上面testop -c foocvaluefoo,但如果我想要testop -c 42?由於cvaluechar *類型,我可以將optarg轉換爲(int)嗎?我試過這樣做,而不使用getopt()並直接訪問argv[whatever],並將其轉換爲整數,但在使用%d進行打印時,我總是會得到一個很大的負數。我假設我沒有正確地提取argv[]或某物,不確定...

回答

34

您需要使用atoi()將字符串轉換爲整數。

4

使用atoi

cvalue = atoi(optarg); 

並聲明cvalue爲int

1

在這種情況下,我會去sscanf()

0

不,你不能只是將其轉換爲整數值。你需要使用sscanf,atoi,atol或類似的函數來轉換它。

10

正如你已經在你的代碼中使用,其原型爲main功能

int main (int argc, char** argv)

什麼都論點是作爲命令行參數,它們傳遞給你的「計劃」作爲數組char *(或者簡單的字符串)。所以,如果你調用一個PROG爲foo.exe 123,第一個參數foo.exe將是一個字符串123如果你嘗試可能使用像一些事情鑄造整數參數(如你所說)的123

不是整數值: (int) argv[1],你不會得到第一個參數的整數值,而是第一個arg存儲在你的地址空間中的一些內存地址。要獲得整數值,必須將字符串值顯式轉換爲整數值。爲此,您可以使用atoi函數。請查看THIS手冊頁獲取可用於轉換的類似功能。

16

以上所有答案都大致正確(Vikram.exe獲取道具以解釋爲什麼你必須調用一個庫函數,而其他人都不會這麼做)。但是,沒有人命名正確的庫函數來調用。請勿使用atoi。不要使用sscanf。如果您不想允許負數,則使用strtol或其相關strtoul。當輸入爲而不是時,只有這些功能才能爲您提供足夠的信息。例如,如果用戶鍵入

./a.out 123cheesesandwich 

atoisscanf將愉快地返回123,這是幾乎可以肯定不是你想要的。只有strtol會告訴你(通過endptr)它只處理字符串的前幾個字符。

(沒有strtoi,但strtod如果你需要讀取一個浮點數)。

4

atoi(),這意味着ASCII到整數使用的功能。同樣,atof()可用於獲取浮點值。