Ich habe mich gefragt, wie Sie 1 Zeichenfolge nehmen, sie mit einem Trennzeichen wie Leerzeichen in 2 Teile aufteilen und die 2 Teile 2 separaten Zeichenfolgen zuweisen können. Ich habe versucht, mit strtok()
aber vergeblich.
Wie teilt man einen String in C in 2 Strings auf?
Markus Szymanski
ereOn
#include <string.h>
char *token;
char line[] = "SEVERAL WORDS";
char *search = " ";
// Token will point to "SEVERAL".
token = strtok(line, search);
// Token will point to "WORDS".
token = strtok(NULL, search);
Aktualisieren
Beachten Sie, dass bei einigen Betriebssystemen strtok
Manpage-Erwähnungen:
Diese Schnittstelle ist durch strsep(3) veraltet.
Ein Beispiel mit strsep
ist unten gezeigt:
char* token;
char* string;
char* tofree;
string = strdup("abc,def,ghi");
if (string != NULL) {
tofree = string;
while ((token = strsep(&string, ",")) != NULL)
{
printf("%s\n", token);
}
free(tofree);
}
-
strtok()
ändert seine Eingabe, daher ist die Verwendung für ein Zeichenfolgenliteral schlechtes Juju (auch bekannt als undefiniertes Verhalten).– Johannes Bode
26. März 2010 um 13:23 Uhr
-
Ja. Das habe ich vergessen zu erwähnen. Vielen Dank.
– bald
26. März 2010 um 13:29 Uhr
-
Ich denke, wenn Sie sich ändern
char *line = "SEVERAL WORDS"
zuchar line[] = "SEVERAL WORDS"
du bist fertig.– Fred Larson
26. März 2010 um 14:00 Uhr
-
@ereOn: Zeiger und Arrays sind verschiedene Dinge in C, bis Sie in der Nähe eines Arrays niesen und es sich dann in einen Zeiger verwandelt. Das ist, wie der Array-Größenausdruck
sizeof(arr)/sizeof(arr[0])
funktioniert.– David Thornley
26. März 2010 um 14:28 Uhr
-
strtok()
ist veraltet? BEEINDRUCKEND!strsep()
ist nicht einmal Standard C.– pmg
6. Januar 2013 um 16:04 Uhr
Für solche Zwecke neige ich dazu, strtok_r() anstelle von strtok() zu verwenden.
Zum Beispiel …
int main (void) {
char str[128];
char *ptr;
strcpy (str, "123456 789asdf");
strtok_r (str, " ", &ptr);
printf ("'%s' '%s'\n", str, ptr);
return 0;
}
Dies wird ausgegeben …
‘123456’ ‘789asdf’
Wenn mehr Trennzeichen benötigt werden, dann Schleife.
Hoffe das hilft.
-
Was ist der Unterschied zwischen strtok_r() und strtok()?
– der Koschmann
26. März 2010 um 13:42 Uhr
-
strtok_r() ist die reentrante Version von strtok(). Mehr zum Wiedereintritt hier: en.wikipedia.org/wiki/Reentrant_%28subroutine%29
– bald
26. März 2010 um 15:55 Uhr
N 1.1
char *line = strdup("user name"); // don't do char *line = "user name"; see Note
char *first_part = strtok(line, " "); //first_part points to "user"
char *sec_part = strtok(NULL, " "); //sec_part points to "name"
Notiz: strtok
ändert den String, also übergeben Sie ihm keinen Zeiger auf das String-Literal.
mkafkas
Sie können strtok() für dieses Beispiel verwenden: es funktioniert für mich
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] ="- This, a sample string.";
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str," ,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ,.-");
}
return 0;
}
Wenn Sie ein Char-Array zugewiesen haben, können Sie einfach a setzen '\0'
wo immer Sie wollen. Zeigen Sie dann mit einem neuen char * -Zeiger auf die Stelle direkt nach dem neu eingefügten '\0'
.
Dies wird jedoch Ihre ursprüngliche Saite zerstören, je nachdem, wo Sie die platzieren '\0'
mmx
Wenn Sie bereit sind, die ursprüngliche Zeichenfolge zu ändern, können Sie das Trennzeichen einfach durch ersetzen \0
. Der ursprüngliche Zeiger zeigt auf die erste Zeichenfolge und der Zeiger auf das Zeichen nach dem Trennzeichen zeigt auf die zweite Zeichenfolge. Das Gute ist, dass Sie beide Zeiger gleichzeitig verwenden können, ohne neue Zeichenfolgenpuffer zuzuweisen.
codaddict
Du kannst tun:
char str[] ="Stackoverflow Serverfault";
char piece1[20] = ""
,piece2[20] = "";
char * p;
p = strtok (str," "); // call the strtok with str as 1st arg for the 1st time.
if (p != NULL) // check if we got a token.
{
strcpy(piece1,p); // save the token.
p = strtok (NULL, " "); // subsequent call should have NULL as 1st arg.
if (p != NULL) // check if we got a token.
strcpy(piece2,p); // save the token.
}
printf("%s :: %s\n",piece1,piece2); // prints Stackoverflow :: Serverfault
Wenn Sie mehr als einen Token erwarten, ist es besser, den zweiten und alle weiteren Aufrufe zu nennen strtok
in einer While-Schleife bis zum Rückgabewert von strtok
wird NULL
.
-
Sieht gut aus, außer dass der zweite Aufruf von strtok() ein anderes Trennzeichen verwendet.
– Johannes Bode
26. März 2010 um 13:29 Uhr
hauptsächlich, weil Strings nicht existieren, sind sie Char-Arrays, Sie werden es schwierig finden, einen String in C zu teilen
– Woot4Moo
26. März 2010 um 13:19 Uhr
Zeigen Sie uns Ihren strtok()-Versuch.
– Fred Larson
26. März 2010 um 13:21 Uhr
Wenn Sie sagen: “Ich habe versucht, strtok(); zu verwenden, aber ohne Erfolg”, warum genau hat es nicht funktioniert? Was war das Problem, auf das Sie gestoßen sind?
– Johannes Bode
26. März 2010 um 13:21 Uhr
Können Sie Ihren Code mit anzeigen
strtok()
?– Naveen
26. März 2010 um 13:21 Uhr
Duplizieren: stackoverflow.com/questions/2523624
– PaulR
27. März 2010 um 20:01 Uhr