strcat Problem



  • Hallo Community,

    habe folgendes Problem:

    char sInput[1024];
    vector<char*> sCmd;
    
    cin.getline(sInput, 1024);
    
    char* sTocken;
    sTocken = strtok(sInput, " ");
    while (sTocken != NULL)
    {
    	sCmd.push_back(sTocken);
    	sTocken = strtok (NULL," ");
    }
    
    int i;
    for(i=2;i<sCmd.size();i++)
    {
    	cout << i << " ";
    	strcat(sCmd[1],"-");
    	cout << sCmd[i] << endl;
    	strcat(sCmd[1],sCmd[i]);
    } 
    
    cout << sCmd[1];
    

    Ich gebe in der Konsole einen Befehl ein zB. "befehl param1 param2 param3 param4"..
    jetzt sollten alle Parameter die nach dem Befehl stehen, die vorher mit strtok getrennt wurden, wieder zusammengefügt und mit - getrennt werden (Bsp.: "param1-param2-param3-param4"), und so im 1 Element des Arrays sCmd[1] gespeichert werden.

    Jedoch wird durch den oben stehenden Code der Wert auf "param1--param2-param3-param4" gesetzt, und somit das 2te Element des Arrays ausgelassen?

    Bitte um Hilfe 🙄



  • strtok() liefert keine Kopie des übergebenen Strings, sondern setzt nur Null-Terminatoren anstelle der vorgesehenen Trennzeichen.

    PS: Da du sowieso mit C++ arbeitest, solltest du auch std::string anstelle der char-Arrays verwenden.



  • CStoll schrieb:

    strtok() liefert keine Kopie des übergebenen Strings, sondern setzt nur Null-Terminatoren anstelle der vorgesehenen Trennzeichen.

    PS: Da du sowieso mit C++ arbeitest, solltest du auch std::string anstelle der char-Arrays verwenden.

    Jedoch werden alle Werte bis auf den Zweiten korrekt durch strcat kopiert? 😕

    Edit: wenn ich "strcat(sCmd[1],"-");" in der Schleife weglasse, werden die Werte korrekt hintereinander gestellt..? 😮



  • Du hast dir mit dem strcat deine Eingaben kaputt gemacht:

    vor dem strtok:        befehl param1 param2 param3#
    nach dem strtok        befehl#param1#param2#param3#
                           ^c[0]  ^c[1]  ^c[2]  ^c[3]
    nach strcat(c[1],"-"): befehl#param1-#aram2#param3#
    

    (dabei steht # für den String-Terminator)

    An der Stelle zeigt cmd[2] auf das durch den strcat()-Aufruf verschobene Stringende von cmd[1], und sowas zählt als leerer String. Bei den weiteren Zeilendurchläufen wird der Bereich überschrieben, in dem der Rest des zweiten Parameters steht.

    Wie gesagt, verwende lieber std::string's, um deine Eingaben zwischenzuspeichern.



  • CStoll schrieb:

    Du hast dir mit dem strcat deine Eingaben kaputt gemacht:

    vor dem strtok:        befehl param1 param2 param3#
    nach dem strtok        befehl#param1#param2#param3#
                           ^c[0]  ^c[1]  ^c[2]  ^c[3]
    nach strcat(c[1],"-"): befehl#param1-#aram2#param3#
    

    (dabei steht # für den String-Terminator)

    An der Stelle zeigt cmd[2] auf das durch den strcat()-Aufruf verschobene Stringende von cmd[1], und sowas zählt als leerer String. Bei den weiteren Zeilendurchläufen wird der Bereich überschrieben, in dem der Rest des zweiten Parameters steht.

    Wie gesagt, verwende lieber std::string's, um deine Eingaben zwischenzuspeichern.

    Danke jetzt versteh ichs 😉


Anmelden zum Antworten