Split C string into tokens using sscanf

21,419

Solution 1

Here is a solution that seems to work:

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);

Solution 2

scanf is more primitive than you seem to think — %s will match everything up to the next whitespace. Your best solution is probably to stick with strtok but throw it only content you've strduped from the authoritative original.

Share:
21,419
Rio
Author by

Rio

Stanford CS grad student, compulsive hacker, bitten by the startup bug.

Updated on March 06, 2020

Comments

  • Rio
    Rio about 4 years

    I'm trying to split a string into tokens but somewhat recursively. I am trying to parse:

    "content=0&website=Google"
    

    so that I have a way to take out the parameters and values. If I try strtok I end up destroying the string I want to parse twice. So I tried

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

    as a first pass, hoping to parse arg again, but it fails, and arg contains the entire string. I tried using "%s\&%s" thinking & was a reserved word, but no luck there.

    Help!

    Edit:

    This was my strtok hack:

    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, "&");
    }
    

    but it doesn't work because splitted's strtok at the end becomes gobbldygook.