2016-05-09 29 views
3

Ich versuche, einen einfachen Rechner mit C zu erstellen. Die Zahlen und Operatoren sollten Parameter sein. Ich habe bereits die Hauptfunktion und eine Funktion berechnen:C - Rechner mit Parametern

Haupt:

int main(int argc, char *argv[]){ 
    long result; 
    long number1 = strtol(argv[1], NULL, 10); 
    long number2 = strtol(argv[3], NULL, 10); 

    result = calculate(number1, number2, argv[2]); 
    printf("Result: %li", result); 

    return 0; 
} 

berechnen:

long calculate(long number1, long number2, char operator){ 
    long result; 

    switch(operator){ 
     case '+': result = number1 + number2; break; 
     case '-': result = number1 - number2; break; 
    } 
    return result; 
} 

Wenn ich starten Sie das Programm wie folgt aus:

./calc 1 + 2

das Ergebnis ist 0. Ich denke, es gibt ein Problem mit dem Operator-Parameter, denn wenn ich '+' anstelle von argv [2] schreibe, funktioniert es. Aber ich weiß nicht, wie ich es beheben kann, dass es auch mit dem Parameter funktioniert.

+4

'berechnen (number1, number2, argv [2]);' -> 'berechnen (number1, number2, * argv [2]);' – BLUEPIXY

+6

Compiler Warnungen sollten wie Fehler behandelt werden! Wenn Ihr Compiler nicht warnt, aktivieren Sie sie. Wenn es immer noch nicht warnt, trash es und bekomme einen modernen Compiler. – Olaf

+1

LOL. Geben Sie auch einen 'default'-Bereich für Ihren 'switch' an. – AhmadWabbi

Antwort

6

Ein Problem ist, dass Ihre calculate Funktion eine char erwartet, aber Ihre main übergibt eine C-Zeichenfolge. Ein weiteres Problem besteht darin, dass beim Übergeben eines unerwarteten Parameters switch nicht result festgelegt wird, was zu undefiniertem Verhalten führt.

Eine Möglichkeit Compiler Hilfe bei der Aufdeckung von Fragen wie diese zu erhalten ist, Prototypen voraus für alle Funktionen des Punktes zu schaffen, in dem die Funktion aufgerufen wird:

// Put the prototype first 
long calculate(long number1, long number2, char operator); 

int main(int argc, char *argv[]){ 
    // main's code with the call of calculate 
} 

long calculate(long number1, long number2, char operator) { 
    // implementation 
} 

Mit einem Prototyp vorhanden, stoppt der Compiler den Build mit einem Fehler, weil argv[2] nicht mit dem erwarteten Typ von char übereinstimmt. Das Problem wird Ihnen sofort klar, Sie fügen das fehlende Sternchen ein und das Programm funktioniert wie erwartet.

Sie sehen wahrscheinlich eine Warnung über das zweite Problem (in einigen Codepfaden result nicht festlegen); Sie sollten es nicht ignorieren und eine default-Klausel hinzufügen, die eine Ausgabe erzeugt, die den Benutzern mitteilt, was schief gelaufen ist.

2

Ich bekomme eine Warnung, wenn ich Ihren Code ausprobiere.

$ gcc main.c 
main.c: In function ‘main’: 
main.c:19:42: warning: passing argument 3 of ‘calculate’ makes integer from pointer without a cast [-Wint-conversion] 
    result = calculate(number1, number2, argv[2]); 
             ^
main.c:4:6: note: expected ‘char’ but argument is of type ‘char *’ 
long calculate(long number1, long number2, char opcode){ 

Nach der Behebung von Warnungen scheint es in Ordnung zu sein.

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

long calculate(long number1, long number2, char opcode) { 
    long result = 0; 

    switch (opcode) { 
     case '+': 
      result = number1 + number2; 
      break; 
     case '-': 
      result = number1 - number2; 
      break; 
     default: { 
      break; 
     } 
    } 
    return result; 
} 

int main(int argc, char *argv[]) { 
    long result; 
    long number1 = strtol(argv[1], NULL, 10); 
    long number2 = strtol(argv[3], NULL, 10); 

    result = calculate(number1, number2, *argv[2]); 
    printf("Result: %li", result); 

    return 0; 
} 

Ausgabe

$ ./a.out 4 + 4 
Result: 8 

(Aber denken sie Vorrang tun könnte: $ ./a.out 4 + 4 * 2 Result: 8 In realen Mathematik, haben Sie Operatorpräzedenz so eine ausführlichere Antwort ist eine Grammatik für einen Rechner, so dass Sie rekursive Betreiber haben How does a simple calculator with parentheses work?)