jmasterx
jmasterx

Reputation: 54113

sscanf for this type of string

I'm not quite sure even after reading the documentation how to do this with sscanf.

Here is what I want to do: given a string of text:

Read up to the first 64 chars or until space is reached Then there will be a space, an = and then another space. Following that I want to extract another string either until the end of the string or if 8192 chars are reached. I would also like it to change any occurrences in the second string of "\n" to the actual newline character.

I have: "%64s = %8192s" but I do not think this is correct.

Thanks

Ex:

element.name = hello\nworld

Would have string 1 with element.name and string2 as

hello
world

Upvotes: 1

Views: 485

Answers (2)

Daryl Fortney
Daryl Fortney

Reputation: 11

Your format string looks right to me; however, sscanf will not change occurences of "\n" to anything else. To do that you would then need to write a loop that uses strtok or even just a simple for loop evaluating each character in the string and swapping it for whatever character you prefer. You will also need to evaluate the sscanf return value to determine if the 2 strings were indeed scanned correctly. sscanf returns the number of field successfully scanned according to your format string.

@sehe shows the correct usage of sscanf including the check for the proper return value.

Upvotes: 1

sehe
sehe

Reputation: 392929

I do recommend std::regex for this, but apart from that, you should be fine with a little error checking:

#include <cstdio>

int main(int argc, const char *argv[])
{
    char s1[65];
    char s2[8193];
    if (2!=std::scanf("%64s = %8192s", s1, s2))
        puts("oops");
    else
        std::printf("s1 = '%s', s2 = '%s'\n", s1, s2);
    return 0;
}

Upvotes: 1

Related Questions