question about scanf

Mtt

Member
Apr 22, 2010
64
2
71
I have been using C for a while, but I encountered this today and its behavior is different from what I expected.

scanf("%d,%d",&d1,&d2);
this matches "1,2" as expected but it also matches "1, 2", why?
Since it matches "1, 2" I thought maybe its because scanf ignores whitespace before any non whitespace character, but it does not match "1 , 2". So scanf ignores the whitespace before 2 but not the whitespace before ,? Why is this happening?
 
Last edited:

mrjminer

Platinum Member
Dec 2, 2005
2,739
16
76
I don't know much C, barely used it for a month over 10 years ago. I will take a shot in the dark.

Going off: http://www.cplusplus.com/reference/cstdio/scanf/
Whitespace character: the function will read and ignore any whitespace characters encountered before the next non-whitespace character (whitespace characters include spaces, newline and tab characters -- see isspace). A single whitespace in the format string validates any quantity of whitespace characters extracted from the stream (including none).
I am presuming that text I quoted only actually applies to the text immediately preceding what that page describes as the "format specifier," however, based on what you wrote. The "," character appears to be part of the format string, like a separator, so that may be why it doesn't apply to it. Or it could just be something they chose to do internally due to optimizations and not trimming the right side of the value. Or just because a lot of older core functions operate based on how things are typically done IRL (ie: like when you list numbers, you don't put a space before the comma).

If my thought is right, then " 1, 2" should work.

And "1, 2 " shouldn't according to the quote since the space is after the 2 (but they may just do a general "trim()" on the value internally or something too to let that pass). You might be able to test that further with the float scanf format specifier (which uses 3 numbers.. like so "1, 2 , 3" wouldn't work but "1, 2, 3 " would if that is the case).
 
Last edited:

Mtt

Member
Apr 22, 2010
64
2
71
I don't know much C, barely used it for a month over 10 years ago. I will take a shot in the dark.

Going off: http://www.cplusplus.com/reference/cstdio/scanf/
I am presuming that text I quoted only actually applies to the text immediately preceding what that page describes as the "format specifier," however, based on what you wrote. The "," character appears to be part of the format string, like a separator, so that may be why it doesn't apply to it. Or it could just be something they chose to do internally due to optimizations and not trimming the right side of the value. Or just because a lot of older core functions operate based on how things are typically done IRL (ie: like when you list numbers, you don't put a space before the comma).

If my thought is right, then " 1, 2" should work.

And "1, 2 " shouldn't according to the quote since the space is after the 2 (but they may just do a general "trim()" on the value internally or something too to let that pass). You might be able to test that further with the float scanf format specifier (which uses 3 numbers.. like so "1, 2 , 3" wouldn't work but "1, 2, 3 " would if that is the case).

"1, 2 " works, "1, 2 3" works too since scanf just ignores the rest after it found 2 matches.

Your guess seems correct for the most part. That is, the quoted only actually applies to the text immediately preceding what that page describes as the "format specifier". That means the quote on http://www.cplusplus.com/ is clearly wrong. It says "the next non-whitespace character" not just format specifier.

Now I know not to trust that site.

Here is the correct reference I found,
http://en.cppreference.com/w/cpp/io/c/fscanf
All conversion specifiers other than [, c, and n consume and discard all leading whitespace characters before attempting to parse the input. These consumed characters do not count towards the specified maximum field width.
scanf does not ignore whitespace before all format specifier.
 

mrjminer

Platinum Member
Dec 2, 2005
2,739
16
76
Yea, I figured that the description that site was off in some regard since it didn't exactly cover your scenario.

Good to see you found the exact reason
 
sale-70-410-exam    | Exam-200-125-pdf    | we-sale-70-410-exam    | hot-sale-70-410-exam    | Latest-exam-700-603-Dumps    | Dumps-98-363-exams-date    | Certs-200-125-date    | Dumps-300-075-exams-date    | hot-sale-book-C8010-726-book    | Hot-Sale-200-310-Exam    | Exam-Description-200-310-dumps?    | hot-sale-book-200-125-book    | Latest-Updated-300-209-Exam    | Dumps-210-260-exams-date    | Download-200-125-Exam-PDF    | Exam-Description-300-101-dumps    | Certs-300-101-date    | Hot-Sale-300-075-Exam    | Latest-exam-200-125-Dumps    | Exam-Description-200-125-dumps    | Latest-Updated-300-075-Exam    | hot-sale-book-210-260-book    | Dumps-200-901-exams-date    | Certs-200-901-date    | Latest-exam-1Z0-062-Dumps    | Hot-Sale-1Z0-062-Exam    | Certs-CSSLP-date    | 100%-Pass-70-383-Exams    | Latest-JN0-360-real-exam-questions    | 100%-Pass-4A0-100-Real-Exam-Questions    | Dumps-300-135-exams-date    | Passed-200-105-Tech-Exams    | Latest-Updated-200-310-Exam    | Download-300-070-Exam-PDF    | Hot-Sale-JN0-360-Exam    | 100%-Pass-JN0-360-Exams    | 100%-Pass-JN0-360-Real-Exam-Questions    | Dumps-JN0-360-exams-date    | Exam-Description-1Z0-876-dumps    | Latest-exam-1Z0-876-Dumps    | Dumps-HPE0-Y53-exams-date    | 2017-Latest-HPE0-Y53-Exam    | 100%-Pass-HPE0-Y53-Real-Exam-Questions    | Pass-4A0-100-Exam    | Latest-4A0-100-Questions    | Dumps-98-365-exams-date    | 2017-Latest-98-365-Exam    | 100%-Pass-VCS-254-Exams    | 2017-Latest-VCS-273-Exam    | Dumps-200-355-exams-date    | 2017-Latest-300-320-Exam    | Pass-300-101-Exam    | 100%-Pass-300-115-Exams    |
http://www.portvapes.co.uk/    | http://www.portvapes.co.uk/    |