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% 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
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.
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.
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
In Ihrem Code ist das Verhalten von atoi(sum)
und was in der letzten Iteration auf argv[argc]
herunterläuft, undefiniert.
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!
Tags und Links c command-line-arguments syntax-error atoi