strtok (Anfänger...)
-
Guten Abend,
ich habe einen "String ich bin ein String\n"
und möchte daraus das erste Wort extrahieren.
Das habe ich bisher so gemacht:
strtok(substring," ");
So bekomme ich auch das erste Wort, aber ohne \0. Wie kann ich das anhängen??
-
Wie kommst Du darauf das Du den String ohne '\0' bekommst?
strtok() hängt eine '\0' dran, definitiv!
-
Danke für die Antwort zu so später Stunde!
Habs nochmal durch den Debugger laufen lassen und da ist keine '\0'
dran. Ist vielleicht was anders falsch??char* LiesWortAusString(char* string) { char* substring = (char*) malloc (sizeof(char)*strlen(string)); char leerzeichen[] = " \n"; strcpy(substring,string); strtok(substring,leerzeichen); return substring; }
-
Zitat aus dem Buch "C für PC's", 2. Auflage, Seite 612:
strtok
#include <string.h> char *strtok(char *s1, const char *s2);
Die Funktion strtok(), "string token" zerlegt den String s1 in sogenannte Token, die durch Zeichen aus s2 voneinander getrennt werden. Ist s1 beispielsweise die Zeichenkette "Hallo C-Freunde !" und s2 die Zeichenkette " " (Blank), so sind in s1 die drei Token "Hallo", "C-Freunde" und "!" enthalten. Zeichen aus s2 gehören nicht zu einem Token.
Beim ersten Aufruf bestimmt die Funktion das erste Token in s1 und hängt ein String-Endezeichen '\0' an. Der ursprüngliche String s1 wird also verändert, indem das erste Trennzeichen nach dem Token durch das String-Endezeichen '\0' überschrieben wird. ei jedem weiteren Aufruf von strtok() mit NULL anstelle von s1 wird das nächste Token gesucht und ein String-Endezeicen '\0' angehängt. Der String s2 kann mit jedem Aufruf der Funktion ausgewechselt werden.
Nun bist Du dran!
-
wie wärs damit:
char* get_first_word(char s[]){ char rs[MAX]; int i; for(i=0;(rs[i]=s[i])!=' ';i++) ; rs[i]='\0'; return rs; }
-
Hast Du die Funktion mal ausprobiert?
Wo sagst Du ihr, das i maximal die Länge des Strings groß werden darf?
Was passiert, wenn ein String OHNE Leerzeichen drin übergeben wird? Meiner Meinung nach müßte das Ding dann abknetern...Du kannst das höchstens so machen:
char* get_first_word(char s[]) { char rs[MAX]; int i; for(i=0;i < (int)strlen(s);i++) // durchläuft s von Anfang bis Ende { if(s[i]==' ') // sobald ein ' ' (Blank) kommt { rs[i]='\0'; // statt Blank kommt '\0' in rs return rs; // und steige aus der Funktion aus } rs[i]=s[i]; // andernfalls pack das Zeichen in rs } return rs; // Kein Leerzeichen im String? Also kompletten String zurück... }
[ Dieser Beitrag wurde am 05.06.2003 um 06:18 Uhr von Hepi editiert. ]
-
Morgen @ all
@ hungry: '\0' wird ganz sicher angehängt bei strtok!
@ Dill: Elegant ist das wahrlich nicht, zumindest müsstest du in der for-Schleife eine Abfrage einbauen:
... for(i=0; (rs[i]=s[i])!=' '; i++) if(s[i]=='\0') break; ...
Eine sehr einfache Methode, die aber nur den ersten Substring bis zum ersten Zwischenraumzeichen liest, dafür aber auch den Vorfall abdeckt, dass kein Leerzeichen enthalten ist, ist die Verwendung von sscanf():
sscanf(s, "%s", rs); return rs;
Da die scanf()-Familie immer nur bis zum ersten Zwischenraumzeichen liest, macht es nach dem ersten Leerzeichen ein break.
[ Dieser Beitrag wurde am 05.06.2003 um 09:16 Uhr von RTC editiert. ]