9
votes

I'm a novice learning C and trying to understand the following code from an online lecture. It scans a string for an integer; if characters are encountered, the sscanf fails.

int n; char c;
if (sscanf(string, " %d %c", &n, &c) == 1)
    //return the integer

else
    // fail

I've read the the man pages for sscanf and am still confused about checking the return value and why this code works. They state that "These functions return the number of input items assigned".

If sscanf encounters characters only, it writes them to &c...but in that case &n won't have been written to. In this case, I would have thought that the return value of sscanf would still be 1?

3
sscanf won't skip over the %d to eat the %c. If it doesn't encounter a number first, it will return 0.Tim Cooper
For some reason the fact that sscanf did so strictly in sequence (per the format string) completely escaped me. Thanks!drjimmie1976

3 Answers

8
votes

In case sscanf has successfully read %d and nothing else, it would return 1 (one parameter has been assigned). If there were characters before a number, it would return 0 (no paramters were assigned since it was required to find an integer first which was not present). If there was an integer with additional characters, it would return 2 as it was able to assign both parameters.

4
votes

Your sscanf(string, " %d %c") will return EOF, 0,1 or 2:

2: If your input matches the following
[Optional spaces][decimal digits*][Optional spaces][any character][extra ignored]

1: If your input failed above but matched the following
[Optional spaces][decimal digits*][Optional spaces][no more data]

[Correction]
0: If your input, after white-space and an optional sign, did not find a digit: examples: "z" or "-".

EOF: If input was empty "" or only white-space.

  • The decimal digits may be preceded by a sign character + or -.
2
votes

You can always check what a function returns by putting it in a printf statement like below :

printf("%d",sscanf(string, " %d %c", &n, &c));

This will probably clear your doubt by printing out the return value of sscanf on your terminal.

Also you can check this out : cplusplus : sscanf

Hope that helped :)