Date Редакция Категория comp Теги C

Задана строка, например,

char str[] = "Can You ever see the Rain";

Нужно преобразовать ее в массив строк (слов) вида

token[0] = "Can";
token[1] = "You";
token[2] = "ever";
...

В простейшем случае, когда известно максимально возможное число слов (MAXWORDS), используем для их хранения статический массив

#include <string.h>
#include <stdio.h>

#define MAXWORDS 10

int main(void)
{
    char str[] = "Can You ever see the Rain";
    int i = 0;
    char *token[MAXWORDS];

    token[i] = strtok(str," ");
    while (token[i])
        token[++i] = strtok(NULL," ");
    token[i] = 0; /* чтобы не выводить все MAXWORDS */

    for (i = 0; token[i]; i++)
        printf("token[%i] = %s\n", i, token[i]);

    return 0;
}

Если возможное количество слов неизвестно, используем динамический массив, размер которого изменяется по мере необходимости с помощью realloc

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

int main()
{
    char str[] = "Can You ever see the Rain";

    char **token = NULL;
    char *p = strtok(str, " ");
    int numOfDelimeters = 0, i;

    while (p)
    {
        token = realloc(token, sizeof(char *) * ++numOfDelimeters);
        if (token == NULL)
            exit(-1);
        token[numOfDelimeters-1] = p;
        p = strtok(NULL, " ");
    }

    for (i = 0; i < numOfDelimeters; i++)
        printf("token[%i] = %s\n", i, token[i]);

    free(token);

    return 0;
}

Кроме того, в связи с двукратным использованием strtoc (:source lang=C token[i] = strtok(str," "); while (token[i]) token[++i] = strtok(NULL," ");

есть интересная идиома:

```C
    while ( (token[i] = strtok(!i ? str : NULL, " ")) )
        i++;


Комментарии

comments powered by Disqus