C – Zeichenfolge in ein Array von Zeichenfolgen aufteilen

Lesezeit: 3 Minuten

Ich bin mir nicht ganz sicher, wie ich das in C machen soll:

char* curToken = strtok(string, ";");
//curToken = "ls -l" we will say
//I need a array of strings containing "ls", "-l", and NULL for execvp()

Wie würde ich vorgehen?

  • Wenn Sie basierend auf Leerzeichen aufteilen möchten, warum haben Sie dies angegeben? ; als Trennzeichen?

    – Oliver Charlesworth

    25. Juni 2012 um 23:03 Uhr

  • Zum Beispiel: string = “ls -l; date; set +v”

    – Jordanien

    25. Juni 2012 um 23:05 Uhr

Filip Roséen - Benutzeravatar von refp
Filip Roséen – Refp

Da hast du schon reingeschaut strtok Fahren Sie einfach auf demselben Pfad fort und teilen Sie Ihre Zeichenfolge mit Leerzeichen (' ') als Trennzeichen, dann verwenden Sie etwas als realloc um die Größe des Arrays zu erhöhen, das die zu übergebenden Elemente enthält execvp.

Sehen Sie sich das folgende Beispiel an, aber denken Sie daran strtok ändert die übergebene Zeichenfolge. Wenn Sie dies nicht möchten, müssen Sie eine Kopie der ursprünglichen Zeichenfolge erstellen, indem Sie verwenden strcpy oder ähnliche Funktion.

char    str[]= "ls -l";
char ** res  = NULL;
char *  p    = strtok (str, " ");
int n_spaces = 0, i;


/* split string and append tokens to 'res' */

while (p) {
  res = realloc (res, sizeof (char*) * ++n_spaces);

  if (res == NULL)
    exit (-1); /* memory allocation failed */

  res[n_spaces-1] = p;

  p = strtok (NULL, " ");
}

/* realloc one extra element for the last NULL */

res = realloc (res, sizeof (char*) * (n_spaces+1));
res[n_spaces] = 0;

/* print the result */

for (i = 0; i < (n_spaces+1); ++i)
  printf ("res[%d] = %s\n", i, res[i]);

/* free the memory allocated */

free (res);

res[0] = ls
res[1] = -l
res[2] = (null)

  • @JordanCarney freut sich, behilflich zu sein.

    – Filip Roséen – Refp

    25. Juni 2012 um 23:20 Uhr

  • @FilipRoséen-refp Können Sie den letzten Codeblock vor dem Drucken und Freigeben des Speichers erklären, der: /* realloc one extra element for the last NULL */? Ich habe Schwierigkeiten, es zu verstehen

    – Honinbo Shusaku

    16. Oktober 2015 um 20:49 Uhr

  • @Abdul Ich glaube, dass am Ende jedes Arrays normalerweise ein Nullzeichen steht, damit der Computer zwischen zwei verschiedenen Arrays unterscheiden kann.

    – Karl

    18. November 2015 um 13:42 Uhr

  • wenn ich dies in eine Funktion verpacke und die zurückgebe res Zeiger, erhalte ich eine Warnung, nachdem ich den von mir zugewiesenen Zeiger freigegeben habe res zu, sagen: warning: attempt to free a non-heap object [-Wfree-nonheap-object]. Hast du eine Ahnung von der Ursache?

    – MattSom

    2. Mai 2020 um 9:23 Uhr


Hier ist ein Beispiel für die Verwendung von strtok von MSDN ausgeliehen.

Und die relevanten Bits müssen Sie mehrmals aufrufen. Das token char* ist der Teil, den Sie in ein Array stopfen würden (Sie können diesen Teil herausfinden).

char string[] = "A string\tof ,,tokens\nand some  more tokens";
char seps[]   = " ,\t\n";
char *token;

int main( void )
{
    printf( "Tokens:\n" );
    /* Establish string and get the first token: */
    token = strtok( string, seps );
    while( token != NULL )
    {
        /* While there are tokens in "string" */
        printf( " %s\n", token );
        /* Get next token: */
        token = strtok( NULL, seps );
    }
}

  • Ich verstehe so viel, aber das gibt mir kein Array von Zeichenfolgen aus den Token. Ich glaube, ich verstehe diesen speziellen Teil davon nicht.

    – Jordanien

    25. Juni 2012 um 23:09 Uhr

  • Warum token = strtok(NULL, seps);? Warum zum NULL?

    – Karl

    18. November 2015 um 13:47 Uhr

  • @c650 Siehe die verlinkte Seite von MSDN, nachfolgende Aufrufe brauchen die NULL.

    – Chris O

    18. November 2015 um 16:51 Uhr

  • Ah ja, ich habe viel gegoogelt und das herausgefunden strtok() verwendet eine statische Variable, um ihren Platz zu speichern.

    – Karl

    18. November 2015 um 19:35 Uhr

1393250cookie-checkC – Zeichenfolge in ein Array von Zeichenfolgen aufteilen

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

Privacy policy