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 ­čśë


Log in to reply