C String trennen im sturct

KillerPinockel

Lieutenant
Registriert
Jan. 2009
Beiträge
621
Hallo,

ich habe eine kleines Problem mit dem zerlegen eines String. Folgendes Beispiel funktioniert!

Code:
		char text[] = "Das,ist,ein,Beispiel";
		char trennzeichen[] = ",";
		char *wort;
		int i = 1;
		wort = strtok(text, trennzeichen);
		while (wort != NULL) {
			printf("Token %d: %s \n", i, wort);
			wort = strtok(NULL, trennzeichen);
			i++;
		}

Nun habe ich folgendes struct:
Code:
struct STURKTUR {
		float Alter;
		char* neu;
	};

Der String wird erstmal so deklariert:
Code:
TEST.neu = "48,103,208,415";

Nun wollte ich den gern in einer Funktion zerlegen und dann die Zahlen in INT speichern. Nur leider klappt das nicht so Recht.
Wäre für jede HIlfe dankbar, auch wenn ich glaube das es super leicht zu lösen ist.
 
Wenn ich den Code so abändere, dann zeigt er mir nix an.
Code:
char trennzeichen[] = ",";
char *wort;
int i = 1;
wort = strtok((*TEST).neu, trennzeichen);
while (wort != NULL) {
			printf("Token %d: %s \n", i, wort);
			wort = strtok(NULL, trennzeichen);
			i++;
		}
 
da du nicht den kompleten code zeigst, muss ich ein wenig raten:
du initialisiert den String TEST.neu falsch, falls du wirklich die Zuweisung so machst wie ganz oben gesagt klappt das nicht.

Im ersten Beispiel funktioniert das nur weil es gleich bei der Initialisierung passiert und da der Compiler genau weiß wieiviel platz er reservieren muss.

guxt du hier
Code:
struct STURKTUR {
    float Alter;
    char* neu;
};

int _tmain(int argc, _TCHAR* argv[])
{
    char dummy[] ="48,103,208,415";
    struct STURKTUR TEST;
    TEST.neu = dummy;
    TEST.Alter = 0.0;

    char text[] = "Das,ist,ein,Beispiel";
    char trennzeichen[] = ",";
    char *wort;
    int i = 1;
    wort = strtok(TEST.neu, trennzeichen);
    while (wort != NULL) {
        printf("Token %d: %s \n", i, wort);
        wort = strtok(NULL, trennzeichen);
        i++;
    }

	return 0;
}
 
the_nobs schrieb:
da du nicht den kompleten code zeigst, muss ich ein wenig raten:
du initialisiert den String TEST.neu falsch, falls du wirklich die Zuweisung so machst wie ganz oben gesagt klappt das nicht.

Im ersten Beispiel funktioniert das nur weil es gleich bei der Initialisierung passiert und da der Compiler genau weiß wieiviel platz er reservieren muss. ...

Okay leuchtet ein, aber was brauchst du noch für Quellcode um sicher zu sein?

Hintergrund ist der, dass beim Aufruf später ein String in der Form "X1,X2,X3,..." dem Programm übergeben werden soll. Danach soll der String zerlegt werden und diese Zahlen geben dann die Indices eines Arrays an, die ich verwenden möchte. Beim Programmstart, weiss ich also die Länge des Strings bereits.
 
Die Länge muss man allerdings schon beim Kompilieren wissen. C hat halt keine echten Strings, sondern nur statische char Arrays. Höhere Programmiersprachen wären da bequemer ;)
Entweder kannst du eine sehr große char Array auf den Stack packen und hoffen dass die Länge ausreicht, oder man muss den Platz dynamisch mit malloc besorgen.
 
Weil ich sowieso gerade das studio offenhabe...
hier ein beispiel code:

Hier habe ich den Input in die Funktion auf eine temporäre Variable kopiert
ACHTUNG: das free am schluss nicht vergessen, außerdem, das ist eine Quick and Dirty hack ich überprüfe da überhaupt nix (Nullpointer, fehlende \0 usw)

Code:
#include <string.h>
#include <stdlib.h>

struct STURKTUR {
    float Alter;
    char* neu;
};

int tokFunk(const char *input)
{
    int numberoftokens=1;
    int inputlen=strlen(input);

    struct STURKTUR TEST;
    TEST.neu = (char *)malloc(inputlen+1);
    TEST.Alter = 0.0;
    strcpy(TEST.neu, input);

    char trennzeichen[] = ",";
    char *wort;
    wort = strtok(TEST.neu, trennzeichen);
    while (wort != NULL) {
        printf("Token %d: %s \n", numberoftokens, wort);
        wort = strtok(NULL, trennzeichen);
        numberoftokens++;
    }

    free(TEST.neu);
    return numberoftokens-1;
}

int _tmain(int argc, _TCHAR* argv[])
{
    char dummy[] ="48,103,208,415";

    char text[] = "Das,ist,ein,Beispiel";

    printf("Number of Tokens Found: %d\r\n", tokFunk(dummy));
    printf("Number of Tokens Found: %d\r\n", tokFunk(text));

    return 0;
}
 
Zuletzt bearbeitet:
Zurück
Oben