2016-04-15 7 views
2

Ich habe Probleme herauszufinden, wie dieser Code funktioniert. Was angenommen wird, hängt von den Argumenten ab, die von der Befehlszeile ausgehen, es wird angenommen, dass eine Begrüßung ausgedruckt wird.Befehlszeilenargument

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]); 
    } 
} 

Wenn jemand nur den Nachnamen setzt, dann wird das Terminal auszudrucken ...

Hallo, Mr. last_name

..., weil sie nur in einem setzen Streit. Das funktioniert gut.

Der Teil, auf dem ich feststecke, ist, wenn die angegebenen Befehlszeilenargumente == 3 sind. Wenn drei Argumente werden dann gegeben entweder das Endgerät annehmen auszudrucken ...

Hallo, Mr. last_name, Ihr Test-Ergebnis ist test_score

... oder ...

Mein Name ist first_name last_name.

Stecke ich in den Befehlszeilenargumenten nur der Nachname und Test-Ergebnis (Smith 3.4) dann ausdruckt (zB mit dem Nachnamen Smith) dann druckt ...

Mein Name ist Smith 3.4

Allerdings funktioniert es für die Eingabe in den Vor- und Nachnamen (John Smith). Dies ergibt ...

Mein Name ist John Smith.

Ich will nicht die Antwort, ich will nur, was ich falsch und Hinweise tue, wie man es beheben.

+0

"Beginnend mit C++" von Tony Gaddis, nicht wahr? Wie auch immer, danke, dass Sie nicht direkt nach Code gefragt haben. Es ist selten unter Neulingen. – CodeMouse92

+0

Dies ist ein einfacher Tippfehler. Sie testen 'argc == testscore', das ** die Anzahl der Argumente ** gegen die Punktzahl testet. Daher wird die zweite Bedingung niemals als wahr gewertet (außer durch irgendeinen seltsamen Zufall). – CodeMouse92

+2

'testscore' ist nicht initialisiert, Sie können es also nicht sinnvoll vergleichen, bevor Sie es setzen. Sie sollten wahrscheinlich versuchen, 'argv [2]' mit 'atof()' zu konvertieren ('strtod()' wäre besser - aber schwieriger, richtig zu kommen) und das Ergebnis mit 0.0 zu vergleichen. Es ist ein wenig faul, aber wahrscheinlich vernünftig anzunehmen, dass, wenn das Ergebnis Null ist, 'argv [2] 'keine Zahl enthält, also behandle es als einen Namen. (Ein gründlicherer Job würde 'strtod()' verwenden und prüfen, ob eine Zahl wie 0 gefunden wurde.) Vielleicht möchten Sie überlegen, was passiert, wenn dem Programm keine Befehlszeilenargumente übergeben werden oder wenn 20 davon übergeben werden. Solltest du nachsehen? –

Antwort

2

Ihr Problem ist mit dieser Zeile:

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

In der Tat, wenn argc == 3, dann mögen Sie überprüfen, ob argv [2] ein numerisches Argument ist.

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

Eine mögliche Implementierung wäre:

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]); 
    } 
} 

testete ich nicht den Code, und es ist wahrscheinlich eine bessere Art und Weise von der Kommandozeile, dass das Argument zu prüfen, „numerisch“ ist.

+0

Danke. Ich habe es verstanden. Ich werde damit herumspielen und sehen, wie man das Argument von der Kommandozeile besser "numerisch" überprüft. Eigentlich – SoonPro

+0

, eine Frage, warum in der if-Anweisung if (* currChar == && iSINT == 1 '') { iSINT = 0; isFloat = 1; } isInt in dieser und in der else-Anweisung auf 0 gesetzt, aber bevor es gleich 1 war? Danke noch einmal. – SoonPro

+0

war die Idee, nicht mehr nach einem numerischen Wert zu suchen, sobald wir ein Zeichen sehen. Grundsätzlich ist die Zeile "if (* currChar == '.' && isInt == 1)" immer falsch, sobald wir ein Zeichen erhalten. Wie gesagt, dies ist eine schnelle und schmutzige Implementierung von "is_numeric". Sie hätten auch sscanf oder eine andere C++ - Bibliotheksfunktion verwenden können, um nach numerischen Werten zu suchen. – ssinfod

3

Ich will nicht die Antwort, ich will nur was ich falsch mache und Hinweise, wie man es beheben kann.

Problem 1: Sie verwenden testscore Variable, bevor es initialisiert wird.

Problem 2: Sie sind nicht Fehler mit atof Handhabung durchführen. Ich würde vorschlagen, strtod() zu verwenden. Sie können damit eine Fehlerbehandlung durchführen, um zu wissen, dass das dritte Argument ein Float ist oder nicht. Sie können auch Ihre eigene Implementierung von atof() erstellen, die konvertiert und Fehler in der Konvertierung meldet, falls vorhanden.

Tipp: Versuchen Sie zunächst prüfen, ob die Anzahl der Argumente für das c-Programm übergeben. Versuchen Sie anschließend, das dritte Argument in Float zu konvertieren, indem Sie strtod() oder Ihre eigene Implementierung verwenden. Wenn es erfolgreich konvertiert wurde, weisen Sie das Ergebnis der Float Convrsion test_score zu und drucken Sie last_name und testscore. Wenn nicht, dann betrachte das dritte Argument als last_name und drucke first_name und last_name.

0

Bekam die Antwort Jungs. Um es zu überprüfen, ohne eine andere Funktion, wäre es

....

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); 
} 

...