Kommandozeilenparameter?
-
Hallo!
Bei folgendem Ansi C Code produziere ich einen Fehler, der mir nicht schlüßig ist:
#include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { char pPatternName[22]= ""; char pPatternID[22]= ""; if ( strlen( argv[argc-1] ) <= 22 ) { strcpy ( pPatternName, argv[argc-1] ); strcpy ( pPatternID, argv[argc-1] ); } printf( "parameterPatternName(%s)\n", pPatternName); printf( "parameterPatternID(%s)\n", pPatternID); return 0; }
Wenn ich nun in der Kommandozeile eine Parameter übergebe:
z.B.: a.exe "1234567890123456:abcde"
dann wird 'pPatternName' ein Leerstring, obwohl der übergebene Kommondozeilenparameter enthalten sein sollte. Bei 'pPatternID' ist der String jedoch enthalten.ENTWEDER:
Szenario 1:
Ich ändere die Variablendeklaration zu:char pPatternName[23]= ""; char pPatternID[23]= "";
Ergebnis:
Nun sind beide Strings (pPatternName, pPatternID) ordentlich belegt.ODER:
Szenario 2:
Ich lösche folgende Zeilen aus dem Code:char pPatternID[22]= ""; strcpy ( pPatternID, argv[argc-1] ); printf( "parameterPatternID(%s)\n", pPatternID);
Ergebnis:
Nun ist in 'pPatternName' der gewünschte übergebende Kommandozeilenparameter enthalten.---
Kann mir jemand erklären wie es zu diesem Verhalten kommt. Der Kommandozeilenparameter ist doch 22 Zeichen lang.
lg Peter
-
Das wichtigste zuerst: Du kopierst ein Zeichen zuviel in die
char[]
.
Wahrscheinlich, ist die terminierende null vonpPatternID
das erste Zeichen vonpPatternName
, deswegen scheintpPatternName
leer.Beachte, dass
strlen()
den '\0' char am Ende nicht mitzählt,strcpy()
, diesen aber mitkopiert und den Platz dafuer haben muss.Du kannst ja spasseshalber mal 25, oder 26 Zeichen in
pPatternID
kopieren und schauen, ob die letzten 3-4 davon inpPatternName
auftauchen
-
pkroll schrieb:
Kann mir jemand erklären wie es zu diesem Verhalten kommt. Der Kommandozeilenparameter ist doch 22 Zeichen lang.
Nein, ist er nicht. Ein C-String besteht (neben dem eigentlichem Text) nocht aus der Endekennung '\0'.
Selbst ein Leerstring belegt also ein Zeichen.Grundlagen. Extrem wichtig. Da steht auch in dem schlechtesten Buch.
char text[] = "1234567890123456:abcde"; printf( "sizeof %u\n", sizeof(text)); // %u ist ihr nicht der ganz richtige Formatspecifier printf( "strlen %u\n", strlen(text));// %u ist ihr nicht der ganz richtige Formatspecifier