2014-09-27 106 views
1

我需要我的程序以這種方式運行./src c 2345 or ./src s 345,其中第一個字符是c或s,第二個是整數。如果有更少的參數以及除c或s之外的任何字符,程序應該拋出一個使用錯誤。這裏是我的代碼在C中比較字符串文字命令行參數

int main(int argc, char **argv) { 

    int num_of_connections = 0, client_sockfd; 
    int max_sockfd, master_socket; 

    fd_set socket_collection, read_collection; 

    // Check validity of the user input 
    if(argc < 3) { 
     if((strcmp(argv[2], "s") != 0) || (strcmp(argv[2], "c") != 0)){ 
      fprintf(stderr, "Usage: ./src <s/c> <port>\n"); 
      exit(EXIT_FAILURE); 
     } 

    } 

當我輸入一個參數時,我得到一個分段錯誤。它也不識別C或S參數。任何幫助將不勝感激。

+1

如果你只輸入一個參數,你會得到一個分段錯誤,因爲沒有'argv [2]'這樣的東西......你應該首先檢查'argc'來查看參數個數是否完全是**你的程序需要什麼。如果是這樣(並且只有那麼)繼續,並檢查它們是什麼。當然,上述兩個檢查都失敗了,打印出使用信息。 – adam10603 2014-09-27 16:37:45

回答

1

if(argc < 3) {如果您只需要兩個參數就沒有意義。在內部的if塊中,您混淆||(邏輯或)與&&(邏輯和)。

在您的調用示例./src s 345中,字符是第一個參數,因此可能argv[2]應該爲argv[1]

if ((argc != 3) || ((strcmp(argv[1], "s") != 0) && 
        (strcmp(argv[1], "c") != 0))) { 
    fprintf(…); 
    return EXIT_FAILURE; 
} 

注:本if (…)條件的所有括號是可選的,因爲C'S運算符優先級。我把它們放在可讀性上。

+0

如果我輸入s或c以外的任何東西,它仍然有效,但它仍然有效。 – 2014-09-27 17:02:28

1

注意main具有非常具體的規範:argv陣列具有argc+1成員,最後被NULL其餘均爲非空不同指針零結尾字符串。

所以,如果argc爲1(例如,如果你運行./src單獨)或2,argv[2]NULL,你不能把它傳遞給strcmp

您可以撥打strcmp(argv[2],"s")只有argc>=3

BTW,我將建議使用getopt(3)或優選(僅在Linux上)getopt_long並接受參數--help--version,每個GNU conventions

此外,編譯所有警告和調試信息(gcc -Wall -g)並使用gdb調試器。使用gdb比在這裏詢問並等待答覆要快得多。

+0

'if(argc <3)'顯然是一個錯誤,請閱讀調用示例。 – kay 2014-09-27 16:34:06

+2

'if(argc < 3) ''是正確的,但需要做一個初步的單獨測試。如果'argc> = 3','strcmp'比較可以跟隨。 – 2014-09-27 16:55:45