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 von pPatternID das erste Zeichen von pPatternName , deswegen scheint pPatternName 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 in pPatternName 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
    

Anmelden zum Antworten