"Stringinhalt" verschieben



  • Hi!

    Welches ist die einfachste und schnellste Methode einen "Stringinhalt" um 1 Byte nach links zu verschieben?

    char *hello;
    strcpy(hello,"Hello World\n");

    "Hello World\n";
    wird zu
    "ello World\n";

    Das kann man doch bestimmt mit irgendeinem Operator machen, oder? Hab leider keine Ahnung davon...

    Danke schon mal im voraus,...

    Gruß,
    Dago



  • Schau dir mal die Methode substr(...) an.



  • Mein Compiler (DevC++) kann mit substr nichts anfangen.
    Kann man es nicht zum Beispiel so machen:

    hello << 1;

    oder so ähnlich?



  • Ok, hab das Problem durch ein bisschen rumprobieren schon selbst gelöst:

    char text[100] = "Hello World\n";
    char *cmdline;
    
    cmdline = new char[strlen(text)+1];
    
    strcpy(cmdline,text);
    
    cmdline++;
    cmdline[strlen(cmdline)-1] = '\0';
    


  • Dago schrieb:

    Welches ist die einfachste und schnellste Methode einen "Stringinhalt" um 1 Byte nach links zu verschieben?

    indem du den pointer nach 'rechts' verschiebst.

    char *p="Hello, World!\n";
    	printf(p);
    	++p;
    	printf(p);
    

    wohl (mit) die schnellste version.



  • #include<cstring>
    
    strcpy(hello,hello+1);
    

    aber meistens ist die Cpt.Tanga-lösung besser.



  • ...geht rechtsschieben?
    --> Aus "Hallo Welt" mach " Hallo Welt" ???



  • Würd mal spontan sagen (ohne getestet zu haben):

    char text[100] = "Hello World\n";
    char *cmdline;
    char lastletter;
    
    cmdline = new char[strlen(text)+1];
    
    strcpy(cmdline,text);
    
    lastletter = text[strlen(text)-1];
    
    cmdline--;
    cmdline[0] = ' ';
    
    text[strlen(text)] = lastletter;
    text[strlen(text)+1] = '\0';
    


  • mit strings gehts noch einfacher, nur einen teil der zeichenkette zu nehmen 😉

    string zeichenkette = "Hallo Welt\n";
    
    cout << s.substr(1,s.size());    //allo Welt
    

    mfg



  • Dago schrieb:

    Würd mal spontan sagen (ohne getestet zu haben):

    char text[100] = "Hello World\n";
    char *cmdline;
    char lastletter;
    
    cmdline = new char[strlen(text)+1];
    
    strcpy(cmdline,text);
    
    lastletter = text[strlen(text)-1];
    
    cmdline--;
    cmdline[0] = ' ';
    
    text[strlen(text)] = lastletter;
    text[strlen(text)+1] = '\0';
    

    Das geht nicht; über das dekrementierte cmdline greifst du auf Speicher zu, der dir nicht gehört. Außerdem kannst du den über new[] angeforderten Speicher so nicht löschen; du mußt dazu schon den Original-Zeiger beibehalten.

    Dago schrieb:

    Ok, hab das Problem durch ein bisschen rumprobieren schon selbst gelöst:

    char text[100] = "Hello World\n";
    char *cmdline;
    
    cmdline = new char[strlen(text)+1];
        
    strcpy(cmdline,text);
        
    cmdline++;
    cmdline[strlen(cmdline)-1] = '\0';
    

    Auch hier hast du das Freigeben des Speichers vergessen. Man sollte mit new/new[] angeforderten Speicher in jedem Fall wieder mittels delete/delete[] löschen, wozu der Zeiger beibehalten und nicht verändert werden sollte.

    Moritz



  • Du solltest mal angeben ob du nun eine String klasse benutzen darfst oder nicht...

    string welt = "Hallo Welt";
        string test;
    
        // Hallo Welt
        cout << welt << endl;
    
        // Ein Zeichen abschneiden
        test = welt.substr(1, test.size()-1);
        cout << test << endl;
    
        // Ein Zeichen am Anfang anhängen
        test = ' ' + welt;
        cout << test << endl;
    

    Wenn nicht einfach die C-Funktionen, sind auch net viel schwerer...

    char * welt = "Hallo Welt";
        char * test = NULL;
    
        // Hallo Welt
        cout << welt << endl;
    
        // Ein Zeichen abschneiden
        test = new char[strlen(welt)-1];
        strcpy(test, welt+1);
        cout << test << endl;
        delete [] test;
    
        // Ein neues Zeichen (hier ist das erste Zeichen dann undefiniert)
        test = new char[strlen(welt)+1];
        strcpy(test + 1, welt);
        cout << test << endl;
        delete [] test;
    

Anmelden zum Antworten