Wie werden alle Befehlszeilenargumente in C zusammengefasst?

7

Ich habe eine Aufgabe. Das Programm soll die Summe aller Befehlszeilenargumente in C ausgeben. Ich habe versucht, diesen Code zu kompilieren, aber nach der Übergabe von Argumenten in der Konsole einen Fehler auszulösen. Unten ist der Code.

%Vor%

Nach dem Kompilieren wird Segmentierungsfehler (core dumped) angezeigt. Ihre Erfahrung kann mein Problem lösen.

Unten ist mein bearbeiteter Code:

%Vor%     
Anudeepsyamprasad 01.02.2018, 14:34
quelle

5 Antworten

11

Weil Sie bis counter == argc iterieren, vergeben Sie einen NULL -Zeiger an atoi() . Es ist einfach, verlassen Sie sich einfach auf die Tatsache, dass das argv -Array ein NULL sentinel hat, und tun Sie dies

%Vor%

Beachten Sie, dass atoi(sum) ein nicht definiertes Verhalten ist, weil sum ein int ist und kein gültiger Zeiger ist. Während atoi() versuchen wird, es zu dereferenzieren.

Fügen Sie schließlich stdlib.h für atoi() hinzu. Ich weiß, dass Sie es nicht eingeschlossen haben, weil ich Warnungen für meinen Compiler aktiviert habe und es warnte mich, dass atoi() implizit definiert wurde. Es könnte funktionieren, aber nur weil undefiniertes Verhalten das ist, UNDEFINED.

Beachten Sie außerdem, dass Sie nicht wissen können, ob das übergebene Argument eine ganze Zahl ist, weil atoi() keine Fehlerprüfung durchführen kann. Sie können stattdessen strtol() verwenden und prüfen, ob alle Werte Ganzzahlen sind.

Also ... so würden Sie eine robustere Version dieses Programms schreiben

%Vor%

BEARBEITEN : Um dieser Kommentar

Es gibt eine Möglichkeit, dass argc == 0 , zum Beispiel, wenn Sie das Programm über eine der Funktionen exec*() ausführen. In diesem Fall müssen Sie vor dem Start der Schleife überprüfen, oder argv[counter] wird ein Element nach dem letzten, d. H. Außerhalb der Grenzen.

    
Iharob Al Asimi 01.02.2018 14:38
quelle
6

Es wird angegeben, dass argv[argc] immer ein Nullzeiger ist. Sie führen einmal zu viele Schleifen durch und übergeben diesen Nullzeiger an atoi , was zu undefiniertem Verhalten führt.

Ändern Sie Ihre Schleifenbedingungen in counter < argc .

Und sum bereits ist eine Ganzzahl, Sie müssen sie nicht in eine Ganzzahl mit atoi konvertieren. Das atoi(sum) wird auch zu undefiniertem Verhalten führen, da die allererste Iteration Null an atoi übergibt, was auch als Null-Zeiger angesehen werden könnte.

    
Some programmer dude 01.02.2018 14:36
quelle
5

Das letzte Element von argv ist definiert , um NULL zu sein, und das erste Element ist immer der Programmname. Daher können Sie Ihren Code auf

reduzieren %Vor%

In Ihrem Code ist das Verhalten von atoi(sum) und was in der letzten Iteration auf argv[argc] herunterläuft, undefiniert.

    
Bathsheba 01.02.2018 14:40
quelle
-1

Eine rekursive Version, nur für den Teufel davon:)

%Vor%     
Bjorn A. 01.02.2018 16:01
quelle
-1
%Vor%

Stellen Sie sicher, dass Sie sich am besten an einen bestimmten Formatierungsstil für Ihren Code halten. Suchen Sie nach Styleguides, wenn Sie Ihre nach Namen definieren möchten. GNU C ist ein guter Ausgangspunkt . Sie machen Ihren Code für Sie lesbarer, einfacher zu debuggen und helfen anderen zu verstehen, was darin vorgeht.

Einige Korrekturen für Ihren oben erwähnten Code ..

%Vor%

atoi () - Dokumentation eines Formulars

Seien Sie vorgewarnt, Ihr Code funktioniert immer noch, wenn Sie Zeichen oder Zeichenfolgen in die Befehlszeile eingeben, aber das Verhalten ist seltsam. atoi () konvertiert das Zeichen in den entsprechenden ASCII-Dezimalzeichenindex / -wert.

Sie können auch einen Nullwert verwenden (argv [] wird immer mit einem NULL-Wert bei argv [argc] beendet), um die Iteration zu beenden. Ich bevorzuge jedoch die bereitgestellten argc.

Hoffentlich hilft dir das ein bisschen. Wenn du nichts verstehst, habe ich mich hier übergeben, kommentieren oder online suchen.

Prost!

    
Ian 01.02.2018 17:10
quelle