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 vonpPatternIDdas erste Zeichen vonpPatternName, deswegen scheintpPatternNameleer.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
pPatternIDkopieren und schauen, ob die letzten 3-4 davon inpPatternNameauftauchen
-
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