zeichenkette bearbeiten (kürzen) klappt nicht



  • hallo leutz,

    ich hab seid ewigkeiten probleme mit den zeichenketten, hier also wiedermal sowas komisches:
    es soll das letzte zeichen in einer zeichenkette "PlayerName" gelöscht werden:
    das folgende sieht zwar umständlich aus, aber alles andere crashte immer sofort ohne kommentar.

    char* PlayerName = "Foo";
    char* PlayerName2 = "";
    strcpy(PlayerName,PlayerName2);
    if(strlen(PlayerName2) > 0){
    	strncpy(PlayerName,PlayerName2,strlen(PlayerName2)-2);
    }
    

    das solltem meiner meinung nach perfekt gehen. machts aber nicht.
    "PlayerName" ist entweder danach komplett leer, oder es crashed,
    oder aber es kommt noch krasser: er schneidet die zeichenkette VORN ab!!
    oh man! das ist zum mäuse melken.

    danke für jeden tip.
    marcello



  • Die Aufgabe ist nicht genau spezifiziert:

    1. Soll der Originalstring verkürzt werden (das geht offensichtlich nur, wenn er schreibbar ist). Falls ja, ist es einfach. Einfach das letzte Zeichen durch 0 ersetzen.

    2. Soll eine Kopie verkürzt werden? Dann zuerst Speicher für die Kopie anfordern, und den Originalstring soweit kopieren, wie du ihn haben willst. Dann durch 0 terminieren.

    Zu deinem Code:

    // Achtung, beide Zeiger verweisen auf readonly-Speicher. Besser als const char * deklarieren
    char* PlayerName = "Foo";
    char* PlayerName2 = "";
    
    // Undefiniertes Verhalten, du überschreibst ein String-Literal:
    strcpy(PlayerName,PlayerName2);
    
    // strlen(PlayerName2) == 0, das ist schließlich ein Leerstring, was soll der Test?
    if(strlen(PlayerName2) > 0){
        // Falls das ausgeführt würde:
        // Undefiniertes Verhalten, Grund siehe oben
        strncpy(PlayerName,PlayerName2,strlen(PlayerName2)-2);
    }
    

    ich will eigentlich gar nicht wissen, wie du auf diesen Code gekommen bist.



  • tach auch!

    also erstmal danke,
    ich sehe da gibts nachholbedarf
    tatsächlich sollte in "PlayerName" der neue Wert stehen, eben aber um ein Zeichen kürzer.

    also wenn du das nochmal richtig wiedergeben kannst, wär das cool.
    das mit den "read-only" speicher ist mir klar, da hab ich wohl ziemlich tief geschlafen 🙂

    thanx

    Marcello



  • Ich gehe jetzt mal davon aus, dass für PlayerName und für PlayerName2 genügend und gleich viel Speicher reserviert ist und, dass man darauf auch schreiben kann ;):

    strcpy(PlayerName, PlayerName2); //String kopieren
    PlayerName[strlen(PlayerName)-1] = 0; //String um ein Zeichen hinten kürzen
    


  • Hallo!

    Vielleicht so:

    char * player_name;
    char * player_name2;
    
    /* dynamisch Speicher für den langen String anfordern */
    player_name = (char *)malloc((strlen("Foo")+1) * sizeof(char));
    strcpy(player_name, "Foo");
    
    /* den küzeren String zunächst nach player_name2 copieren */
    player_name2 = (char *)malloc(strlen(player_name) * sizeof(char));
    strncpy(player_name2, player_name, strlen(player_name)-1);
    
    /* den allocierten Speicher von player_name verkürzen */
    player_name = (char *)realloc(player_name, (strlen(player_name2)+1) * sizeof(char));
    
    /* den verkürzten String wieder zurück nach player_name */
    strcpy(player_name, player_name2);
    
    /* Speicher von player_name2 wieder freigeben */
    free(player_name2);
    

    Na ja vielleicht etwas sehr umständlich



  • Ja und fehlerhaft. strncpy() hat nämlich ein gefährliches Manko. Es schreibt nicht automatisch das Stringendezeichen in den kopierten String ⚠



  • AJ schrieb:

    Ja und fehlerhaft. strncpy() hat nämlich ein gefährliches Manko. Es schreibt nicht automatisch das Stringendezeichen in den kopierten String ⚠

    ...aber nur, wenn src größer ist als len:

    char * strncpy(char *dst, const char *src, size_t len)
    

Anmelden zum Antworten