2013-07-07 62 views
2

我正在寫一個簡單的程序,它採用參數形式的用戶和處理它們。 我有argv中的參數,它是二維數組。但是當我運行程序時,我得到了垃圾值和分段錯誤錯誤。我曾嘗試使用argc作爲終止條件,它的工作原理。但我想用指針來做。 這裏指針有什麼問題。開關案例解析選項

#include<stdio.h> 
int main(int argc, char *argv[]) 
{ 
    while (++(*argv)) 
    { 
     if (**argv == '-') 
     { 
      switch (*argv[1]) 
      { 
       default: 
        printf("Unknown option -%c\n\n", (*argv)[1]); 
        break; 
       case 'h': 
        printf("\n option h is found"); 
        break; 
       case 'v': 
        printf("option V is found"); 
        break; 
       case 'd': 
        printf("\n option d is found"); 
        break; 
      } 
     } 
     printf("\n outside while : %s", *argv); 
    } 
} 

程序運行爲:

./a.out -h -v -d 

謝謝

+2

另外,你爲什麼不使用'getopt的()'用於解析命令行? – 2013-07-07 05:29:32

+0

@ H2CO3:也許這是一個練習 - 一種說明選項解析如何變得困難的方法。然後在下一課中,大顯身手:getopt可以爲您做到!這聽起來像是我想做的一件事,那就是傾聽學生對發現getopt之後似乎浪費時間的抱怨抱怨。 –

+0

甚至使後更正所選擇的回答表明,嘗試使用此命令行運行程序「./a.out - 」你應該在你的switch語句... – Curt

回答

5
  • 如果你想程序的參數遍歷尋找終止空指針,你的外循環應該是

    while (*++argv) 
    

    不是

    while (++*argv) // <- incorrect! 
    

    你在你的代碼中。您的switch表達式寫入不正確。儘管您的意圖很明確,但您的實施忽略了運營商的優先級。

    switch (*argv[1]) { // <- incorrect! 
    

    實際上應該是

    switch ((*argv)[1]) { 
    
  • 以前if

    if (**argv == '-') 
    

    是好的,但因爲它是相當於

    if ((*argv)[0] == '-') // <- better 
    

    也許你應該改寫它,以便與switch保持一致。

+0

謝謝@AndreyT。而(* ++ argv)和switch((* argv)[1])按預期工作。 –

2

您的最終問題是運營商優先級。不要在沒有必要的時候聰明一點。 *操作員不像您認爲的那樣工作。我已經使用[0],而不是重寫你的代碼,而現在它的工作原理:

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    while ((++argv)[0]) 
    { 
      if (argv[0][0] == '-') 
      { 
        switch (argv[0][1]) { 

          default: 
            printf("Unknown option -%c\n\n", argv[0][1]); 
            break; 
          case 'h': 
            printf("\n option h is found"); 
            break; 
          case 'v': 
            printf("option V is found"); 
            break; 
          case 'd': 
            printf("\n option d is found"); 
            break; 
        } 
      } 

      printf("\n outside while : %s", argv[0]); 
    } 
} 
0

argv是一個字符串數組。 argv[0]是您的案例中的程序名稱a.out。您的選擇從argv[1]開始。所以你需要從1到argc-1重複argv以獲得選項。

而且在這裏看到:Parsing Program Arguments

+0

OP顯然是爲了使外循環'while(* ++ argv))'。它已經跳過了「程序名稱」參數。但是它實施了一個錯誤。 – AnT