2016-04-15 192 views
2

我無法弄清楚如何使代碼工作。假定根據命令行給出的參數,假設打印出問候語。命令行參數

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

double testscore; 

    if (argc == 2) { 
     printf("Hello, Mr.%s.\n", argv[1]); 

    } 
    else if (argc == 3 && argc == testscore) { 
     testscore = atof(argv[2]); 
     printf("Hi, Mr.%s, your score is %.1f\n", argv[1], testscore); 
    } 
    else { 

     printf("My name is %s %s.\n", argv[1], argv[2]); 
    } 
} 

如果有人提出只有自己的姓氏,終端會打印出...

您好,先生姓氏

...因爲他們只放在一個論據。這工作正常。

我被卡住的部分是當給出的命令行參數是== 3。如果3個參數給出那麼無論是終端是假設打印出...

嗨,姓氏先生,你的測試成績爲test_score

......或者......

我的名字是first_name last_name。

如果我把在命令行參數只有姓氏和考試成績(史密斯3.4),那麼它打印出來(例如使用姓史密斯),那麼它打印出...

我的名字是史密斯3.4

然而,它的名字和姓氏(約翰史密斯)的名字。這給...

我的名字是約翰史密斯。

我不想要的答案,我只是想什麼,我就如何解決它做錯了和提示。

+0

由託尼·加迪斯 「開始接觸C++」,對不對?無論哪種方式,謝謝你沒有直接要求代碼。新手之間很少見。 – CodeMouse92

+0

這是一個簡單的錯字。您正在測試'argc == testscore',它正在測試**對照分數的參數**數量。因此,第二個條件永遠不會評估爲真(除了一些奇怪的僥倖)。 – CodeMouse92

+2

'testscore'是未初始化的,因此在設置它之前不能進行有用的比較。你可能應該嘗試用'atof()'('strtod()'''將'argv [2]'轉換爲更好 - 但難以正確)並將結果與​​0.0進行比較。這有點懶,但假設如果結果爲零,可能是合理的,'argv [2]'不包含數字,所以把它當作一個名字。 (一個更徹底的工作會使用'strtod()'並檢查是否找到一個數字,例如0)。您可能會想如果程序沒有傳遞命令行參數,或者傳遞了20個參數,會發生什麼情況。你應該檢查嗎? –

回答

2

你的問題是這一行:

else if (argc == 3 && argc == testscore) { 

事實上,當ARGC == 3,那麼你要檢查的argv [2]是一個數字參數。

else if ((argc==3) && (is_numeric_arg(argv[2])==1)) { 

一個可能的實現是:

int is_numeric_arg(char* arg) 
    { 
     int isInt = 0; 
     int isFloat = 0; 
     int isChar = 0; 
     char* currChar; 
     int i = 0; 
     currChar = arg; 
     isInt = 1; 
     while (*currChar != '\0') 
     { 
      if(*currChar < '0' || *currChar > '9') 
      { 
       if(*currChar == '.' && isInt == 1) 
       { 
        isInt = 0; 
        isFloat = 1; 
       } 
       else 
       { 
        isInt = 0; 
        isChar = 1; 
       } 
      } 
      currChar++; 
     } 
     if (isChar == 1){ return 0; } // argument is a string 
     else { return 1; } // argument is a int or float 
    } 

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

    double testscore; 

    if (argc == 2) { 
     printf("Hello, Mr.%s.\n", argv[1]); 

    } 
    else if ((argc==3) && (is_numeric_arg(argv[2])==1)) { 
     testscore = atof(argv[2]); 
     printf("Hi, Mr.%s, your score is %.1f\n", argv[1], testscore); 
    } 
    else { 

     printf("My name is %s %s.\n", argv[1], argv[2]); 
    } 
} 

我沒有測試的代碼,有可能是一個更好的方法來檢查命令行參數爲「數字」。

+0

謝謝。我明白了。我會解決它,看看如何更好地檢查命令行中的參數是「數字」。 – SoonPro

+0

其實,有一個問題,爲什麼在if語句中if(* currChar =='。'&& isInt == 1) { isInt = 0; isFloat = 1; } isInt在這個和else語句中,但在它等於1之前設置爲0?再次感謝。 – SoonPro

+0

這個想法是一旦我們看到一個字符就停止檢查一個數字值。基本上,只要我們得到一個字符,if(* currChar =='。'&& isInt == 1)「就會一直爲false。正如我所說的,這是「is_numeric」的快速和骯髒的實現。您也可以使用sscanf或其他C++庫函數來檢查數值。 – ssinfod

3

我不希望得到答案,我只是想要我做錯了什麼,並提示如何解決它。

問題1:在初始化之前,您正在使用testscore變量。

問題2:您沒有執行與atof的錯誤處理。我會建議使用strtod()。你可以用它來執行一些錯誤處理,以知道第三個參數是否爲浮點數。您也可以創建自己的atof()實現,它將轉換並報告轉換錯誤(如果有)。

提示:嘗試首先檢查傳遞給c程序的參數的數量。之後,嘗試使用strtod()或您自己的實現將第三個參數轉換爲浮點數。如果成功轉換,則將float convrsion的結果分配給test_score並打印last_nametestscore。如果不是,則考慮第三個參數爲last_name並打印first_namelast_name

0

知道答案的人。要檢查它,而無需使用其他功能,這將是

....

else if (argc==3 && sscanf(argv[2], "%f", testscore) 


{ 


    testscore = atof(argv[2]); 

    printf("Hi, Mr.%s, your score is %.1f\n", argv[1], testscore); 
} 

...