String zerteilen



  • HAllo Leute,
    ich habe in C++ ein Chararray, ich weiß das das array folgenden Aufbau hat
    VAR1|VAR2

    Wie komme ich nun an die einzelnen Variablen, die mit einem Trennstrich getrennt sind?

    MFG, Rodney



  • Mit [msdn]strtok[/msdn]



  • C Newbie schrieb:

    Mit [msdn]strtok[/msdn]

    danke, mit Zeigern etc bin ich noch nicht so erfahren, wie bekomme
    ich ein char* in ein normales Chararray rein?

    char serverip[16];
    char *token;
    token = strtok(buffer, "|");
    serverip = *token; // Diese Stelle funktioniert nicht...
    


  • Rodney schrieb:

    C Newbie schrieb:

    Mit [msdn]strtok[/msdn]

    danke, mit Zeigern etc bin ich noch nicht so erfahren, wie bekomme
    ich ein char* in ein normales Chararray rein?

    char serverip[16];
    char *token;
    token = strtok(buffer, "|");
    serverip = *token; // Diese Stelle funktioniert nicht...
    

    😕 😕



  • Hallo,

    warum benutzt du nicht einfach die Boardsuche? Die Frage wurde bereits mehrfach beantwortet, sowie Alternativen genannt.



  • CarstenJ schrieb:

    Hallo,

    warum benutzt du nicht einfach die Boardsuche? Die Frage wurde bereits mehrfach beantwortet, sowie Alternativen genannt.

    die habe ich schon benutzt, dort stand aber irgendwie überall nur das das nicht möglich sei...

    char* ist doch ein zeiger auf ein/mehrere Zeichen
    also müsste man doch mit
    [cpp]
    char serverip[16];
    char *token;
    token = strtok(buffer, "|");
    *serverip = token
    [/cpp]
    diesen Zeiger dereferenzieren und dem array zuordnen können oder?

    MFG, Rodney



  • Nein, Du kannst nicht einfach eine Zeichenkette einem Array zuweisen.
    Im Prinzip müsstest Du alle Zeichen einzeln in das Array kopieneren. Stattdessen kannst Du aber z.B. die Funktion strcpy() nutzen (wobei das jetzt eigentlich C ist):

    #include <cstring>
    ...
    char serverip[16];
    char *token;
    token = strtok(buffer, "|");
    strcpy(serverip, token);
    


  • Solche Stringoperationen mit strtok etc. durchzuführen ist schon C, mit Strings geht das viel leichter, von den anderen Vorteilen mal abgesehen:

    const string str = "VAR1|VAR2";
    string str1 = str.substr(0, str.find('|'));
    string str2 = str.substr(str.find('|')+1);
    

    MfG MAV



  • Hi Leute,
    ihr habt mir wirklich schon viel geholfen, langsam habe ich auch gelernt mit der MSDN umzugehen 🙂

    Allerdings hab ich noch ein dickes Problem:
    Ich habe folgende Funktion

    int receive_nr(LPCSTR nachricht) { // Mit dieser Funktion werden Nachrichten empfangen und zerteilt
    	char* nummer = 0;
    	char* token = 0;
    	char* dienachricht = 0;
            printf("übergebene Nachricht:",nachricht);
    
    	strcpy (dienachricht, nachricht);
    
    	token = strtok(dienachricht, "|");
    	strcpy(nummer, token);
    	return StrToInt(nummer);
    }
    

    Diese bekommt jetzt bspw "1|0|Rodney" übergeben, und soll die 1 zurückgeben.
    (ist jetzt nur die einfache Version)
    Allerdings bekomme ich immer hier

    strcpy (dienachricht, nachricht);
    

    einen Zugriffsfehler von Windows mitgeteilt, der mir nicht wirklich einleuchtet.

    MFG, Rodney



  • Der Fehler kommt dadurch zu Stande, dass Du mit strcpy in Speicher schreibst, der Dir nicht gehört. Denn nachricht ist bei Dir ein Zeiger auf einen char - mehr nicht. Damit hat Du noch keinen Speicherplatz für die Zeichenkette reserviert.
    Den musst Du explizit angeben, z.B. mit char nachricht[50] (oder eine andere angemessene Länge).



  • Asgard schrieb:

    Der Fehler kommt dadurch zu Stande, dass Du mit strcpy in Speicher schreibst, der Dir nicht gehört. Denn nachricht ist bei Dir ein Zeiger auf einen char - mehr nicht. Damit hat Du noch keinen Speicherplatz für die Zeichenkette reserviert.
    Den musst Du explizit angeben, z.B. mit char nachricht[50] (oder eine andere angemessene Länge).

    hatte ich versucht, mit dem selben Ergebnis 🙄



  • Was ist denn mit dem Beispiel auf der MSDN Seite. Das funktioniert bei mir, und erfüllt doch auch deine Bedürfnisse, oder etwa nicht?



  • Ich meinte übrigens im vorherigen Beitrag dienachricht und nicht nachricht, habe mich da vertan.
    Dann bleibt eigentlich nur noch die Möglichkeit, dass nachricht zu lang ist, ansonsten müsste das so funktionieren.



  • Tja, mit strings ist sowas besser zu debuggen *für das Forum werb, in dem sich das Geschehen abspielt'



  • ja ich habe mir schon gedacht, dass du dieNachricht meintest und hab das auch so probiert. Irgendwie ist ja auch der komplette LPCSTR nicht richtig da, weil er auch diesen auch als leer ausgibt, obwohl ich einen STring übergebe!



  • Dann zeig mal ein bisschen mehr Programmcode.

    Aber Mis2Com hat schon recht, entweder sollte der Thread verschoben werden, oder "echtes" C++ eingesetzt werden.


Anmelden zum Antworten