Эффективный способ разбить строку на массив, основанный на символе, например.% В C? - PullRequest
2 голосов
/ 01 октября 2009

Здесь можно найти похожую вещь для C.

Мне нужно разбить предложение на массив символов в зависимости от появления символа:%

Пример

Если моя отправка составляет мой% здоровый% собака , тогда я смогу получить свою, здоровую и собаку отдельно Это также может быть в цикле.

ТХ

Ответы [ 5 ]

4 голосов
/ 01 октября 2009

strtok - это стандартная функция C для выполнения токенизации строки.

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

int main()
{
        char c[] = "my%healthy%dog";
        char *token = strtok(c, "%");
        while (token != NULL)
        {
                printf("%s\n", token);
                token = strtok(NULL, "%");
        }
        return 0;
}


$ ./a.exe
my
healthy
dog

Также обратите внимание, что strtok использует статические переменные для внутреннего использования, поэтому не является поточно-ориентированным Для обеспечения безопасности потоков вам придется использовать функцию strtok_r.

0 голосов
/ 01 октября 2009

strtok () должен сделать свое дело. Вы также можете вызвать его повторно с NULL в качестве первого аргумента для поиска с того места, где вы остановились.

Из документации :
Каждый последующий вызов с нулевым указателем в качестве значения первого аргумента начинает поиск по сохраненному указателю и ведет себя, как описано выше.

0 голосов
/ 01 октября 2009

с использованием strtok.

См. это :

0 голосов
/ 01 октября 2009

Решением является strtok () в string.h.

Вот хороший пример использования.

/* strtok example by mind@metalshell.com
 *
 * This is an example on string tokenizing
 *
 * 02/19/2002
 *
 * http://www.metalshell.com
 *
 */

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

int main(int argc, char *argv[])
{
        int x = 1;
        char str[]="this:is:a:test:of:string:tokenizing";
        char *str1;

        /* print what we have so far */
        printf("String: %s\n", str);

        /* extract first string from string sequence */
        str1 = strtok(str, ":");

        /* print first string after tokenized */
        printf("%i: %s\n", x, str1);

        /* loop until finishied */
        while (1)
        {
                /* extract string from string sequence */
                str1 = strtok(NULL, ":");

                /* check if there is nothing else to extract */
                if (str1 == NULL)
                {
                        printf("Tokenizing complete\n");
                        exit(0);
                }

                /* print string after tokenized */
                printf("%i: %s\n", x, str1);
                x++;
        }

        return 0;

}

То, что сбивает с толку людей о strtok, - это когда вы в первый раз вызываете метод первым аргументом, передаваемым в указателе на строку, которую вы хотите маркировать, и при последующих вызовах вы передаете NULL. В своей реализации strtok использует статическую переменную для отслеживания того, откуда он должен начать поиск при последующих вызовах.

  • Передав NULL, вы говорите strtok продолжить поиск с того места, где мы остановились в прошлый раз.
  • Передача указателя! = NULL вы сообщаете токенизатору, что начинаете с начала новой строки, поэтому не обращайте внимания на информацию о предыдущем состоянии.
0 голосов
/ 01 октября 2009

Проверьте функцию strtok в string.h.

Это хороший урок о том, как это работает: http://www.cplusplus.com/reference/clibrary/cstring/strtok/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...