Разбить строку C на токены с помощью sscanf - PullRequest
6 голосов
/ 06 марта 2012

Я пытаюсь разбить строку на токены, но несколько рекурсивно.Я пытаюсь разобрать:

"content=0&website=Google"

, чтобы у меня был способ вывести параметры и значения.Если я попытаюсь strtok, я уничтожу строку, которую хочу проанализировать дважды.Поэтому я попытался

char *contents = "content=0&website=Google"
char arg[100];
char value[100];
sscanf(contents, "%s&%s", arg, value);

в качестве первого прохода, надеясь снова проанализировать arg, но это не удалось, и arg содержит всю строку.Я пытался использовать "%s\&%s", думая, что & было зарезервированным словом, но не повезло.

Помощь!

Редактировать:

Это был мой взлом strtok:

static void readParams(char * string, char * param, char * value) {
    printf("This is the string %s\n",string);
    char * splitted = strtok (string,"=");

    while (splitted != NULL)
    {
        printf("This is the string %s\n",splitted);
        splitted = strtok (NULL, "=");
        // Then do some saving to param and value
    }
}
char * splitted = strtok (contents,"&");
int counter = 0;

while (splitted != NULL)
{
    char * t_str = strdup(splitted);
    readParams(t_str, param, value);
    splitted = strtok (NULL, "&");
}

, но он не работает, потому что разделенный strtok в конце становится gobbldygook.

Ответы [ 3 ]

9 голосов
/ 06 марта 2012

Вот решение, которое, кажется, работает:

char *contents = "content=0&website=Google";
char arg[100] = {0};
char value[100] = {0};
sscanf(contents, "%[^&]&%s", arg, value);
printf("%s\n%s\n", arg, value);
1 голос
/ 06 марта 2012

scanf более примитивно, чем вы думаете - %s будет соответствовать всему до следующего пробела.Ваше лучшее решение - это, вероятно, придерживаться strtok, но выбрасывать только тот контент, который вы strdup редактировали из авторитетного оригинала.

0 голосов
/ 06 марта 2012

Я рекомендую что-то похожее на следующее:

char t_str[100];
strncpy(t_str, contents, 100);
//now strtok() on t_str, original contents will be preserved
...