Segmentation fault mit strcmp()
if(strcmp(argv[2], NULL) == 0)
Bin ich vorbei 3 Kommandozeilen-Argumente, aber ich will auch, dass es mit nur 2 Befehlszeilen-Argumente, die mit der obigen Aussage. Aber "segmentation fault" - Fehler angezeigt wird.
Ich habe auch versucht mit
if(argc < 3)
aber auch nicht funktioniert...gleiche segmentation fault...
Verwenden
Sorry, aber ich denke, es gibt keinen Empfänger, was Wert wäre
Ich Kommentar auf der Grundlage der falsche code, der nur von couse, wenn unsufficent Argumente übergeben, dann wird es out-of-bound-Fehler
if(argv[2] == NULL)
Sorry, aber ich denke, es gibt keinen Empfänger, was Wert wäre
argv[2]
haben, wenn argc==2
. Bitte siehe mein update in meiner Antwort.Ich Kommentar auf der Grundlage der falsche code, der nur von couse, wenn unsufficent Argumente übergeben, dann wird es out-of-bound-Fehler
InformationsquelleAutor an56k | 2013-10-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weil der code
if(strcmp(argv[2], NULL) == 0)
, übergeben Sie NULL als string-Zeiger aufstrcmp()
Funktion; die versuchen, die Ehrerbietung an NULL zu vergleichen chars codes (z.B. acsii-code) diese Ursache Undefiniertes Verhalten zur Laufzeit.Sollten Sie vergleichen einen string-Zeiger mit der NULL mit
==
alsif(argv[2] == NULL)
Implementieren Sie können dies auf zwei Arten:
Die wichtigsten syntax ist:
Das erste argument
argc
ist argument-Zähler, insgesamt ist die Anzahl der übergebenen Argumente, um Ihren Prozess einschließlich der Prozess-Namen.Also, wenn Sie geben keine zusätzlichen argument dann
argc == 1
z.B../exe
Angenommen, wenn Sie drei Argumente wie folgt:
Dann
argc == 3
,es sieht aus wie Sie auf der Durchreise sind zwei Argumente, aber auch ausführbare Datei Namen, den Sie tatsächlich vorbei drei Argumente zu verarbeiten.
So können Sie von
argc
Wert der Iteration in einer Schleife zum drucken übergebenen Argumente (außer ausführbare)Zweite Technik ist mit der zweiten argument:
argv[]
ist NULL-terminiertes array von string-strings, soargv[argc]
ist immer gleich NULL. Sie können diese Informationen verwenden, in-Schleife Durchlaufen und verarbeiten der übergebenen Argumente.Dies zu verstehen, nehmen wir an, Sie ausgeführte Funktion:
dann
argv[0] == ./exe
,argv[1] == firstname
undargv[2] == lastname
undargv[3] == NULL
Beachten dieser Zeitargc == 3
(argv[argc]
bedeutetargv[3]
== NULL).Zum Beispiel drucken Sie alle Argumente, Sie können schreiben Sie code wie:
Merkst du
argv[0]
wird immer die ausführbare Datei Namen! das bedeutet, Wann immer Sie drucken müssen Sie Ihre EXE-Namen verwendenargv[0]
statt hart codieren Namen der ausführbaren beim schreiben von code, so dass, wenn Sie neu kompilieren, und geben Sie neue Namen für die ausführbare Datei dannargv[0]
immer Drucke richtigen Namen. Sie sollten code schreiben wie folgt:InformationsquelleAutor Grijesh Chauhan
Erstens, du sollst immer verwenden
strcmp(some_string, "")
stattstrcmp(some_string, NULL)
um zu überprüfen, ob ein string leer ist.Aber in Ihr problem, Sie soll prüfen,
Das ist, weil die ausführbare Datei selbst ist auch im array
argv
. Überlegen Sie, du bist berufen etwas wie./a.out param0 param1
, dannargc
wäre3
undargv[0]="./a.out"
,argv[1]="param0"
,argv[2]="param1"
.BEARBEITET:
Auch nie testen
if(strcmp(argv[2], NULL) == 0)
direkt. Testen Sie immerargc
ersten. Da es keine Empfänger, welcher Wert gespeichert werden würde inargv[argc+n]
fürn >= 0
argv[argc]
wird ein null-Zeiger. So, Tests für die Anzahl der Argumente können in zwei verschiedene Arten geschehen: 1) durchargc
2). auf der Suche für die erste null-Eintrag inargv[]
.Nie test
strcmp(argv[2], NULL)
überhaupt. Es kann unmöglich funktionieren. Weder argument null sein kann.InformationsquelleAutor starrify
Können Sie nicht verwenden
strcmp()
zu vergleichen, umNULL
. Weder argument null sein kann. In dieser situation spielt es sowieso keinen Sinn. Wenn das argument nicht vorhanden ist, istargc
wird < 3 und wenn ist es irgendwie leer, es wird die Länge null. Nie null.0)
Keine Frage Lesen.
das können Sie gerne tun:
i = 1; while(argv[i]){ printf(..); i-- }
Tut mir Leid für diesen Kommentar Lesen, ohne die Frage genau. Und danke für den Hinweis.
InformationsquelleAutor user207421