Wie teilt man einen String in C in 2 Strings auf?

Lesezeit: 4 Minuten

Benutzeravatar von Mark Szymanski
Markus Szymanski

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.

  • 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

Benutzeravatar von ereOn
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" zu char 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


Benutzeravatar von N 1.1
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.

Benutzeravatar von mkafkas
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'

Benutzeravatar von mmx
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.

Benutzeravatar von codaddict
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

1403490cookie-checkWie teilt man einen String in C in 2 Strings auf?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy