By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
434,655 Members | 1,860 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 434,655 IT Pros & Developers. It's quick & easy.

Warning in data format of the fscanf function

P: n/a
Hi,
I hope to be not off topic..
I have a string on a file "00:32:43:54:A2:2D" (let's say a MAC
address)
I use fscanf like this
fscanf( file, "%02X:%02X:%02X:%02X:%02X:%02X",
ptr, ptr+1, ptr+2,
ptr3, ptr+4, ptr+5);
It works, but I get warnings as the expected size is int while I'm
storing onto a uint8_t array.. is there a format to store onto a
uint8_t array instead of using a int array? ( I mean to don't get any
warning)
Things are working but I hate that warnings..
Thanks

Aug 7 '07 #1
Share this Question
Share on Google+
6 Replies


P: n/a
On Tue, 07 Aug 2007 10:11:38 +0000, InuY4sha wrote:
Hi,
I hope to be not off topic..
I have a string on a file "00:32:43:54:A2:2D" (let's say a MAC
address)
I use fscanf like this
fscanf( file, "%02X:%02X:%02X:%02X:%02X:%02X",
ptr, ptr+1, ptr+2,
ptr3, ptr+4, ptr+5);
It works, but I get warnings as the expected size is int while I'm
storing onto a uint8_t array.. is there a format to store onto a
uint8_t array instead of using a int array? ( I mean to don't get any
warning)
Things are working but I hate that warnings..
They are working because you're lucky enough. "Something" tells me
that your machine is little endian. (Figuring out what this
"something" is is left as an exercise.)

Use the macro SCNx8 in <inttypes.hwhich expands to a string
literal, like this:
fscanf(file, "%02" SCNx8 ":%02" SCNx8 ":%02" SCNx8 ":%02" SCNx8
":%02" SCNx8 ":%02" SCNx8, ptr, ptr+1, ptr+2, ptr+3,
/* you didn't actually mean ptr3, did you? */, ptr+4, ptr+5);

This work due to string concatenation. For example, if SCNx8
expands to "hhx", "%02" SCNx8 ":%02" expands to "%02" "hhx" ":%02"
which is equivalent to "%02hhx:%02".
--
Army1987 (Replace "NOSPAM" with "email")
"Never attribute to malice that which can be adequately explained
by stupidity." -- R. J. Hanlon (?)

Aug 7 '07 #2

P: n/a
On 7 Ago, 12:46, Army1987 <army1...@NOSPAM.itwrote:
On Tue, 07 Aug 2007 10:11:38 +0000, InuY4sha wrote:
Hi,
I hope to be not off topic..
I have a string on a file "00:32:43:54:A2:2D" (let's say a MAC
address)
I use fscanf like this
fscanf( file, "%02X:%02X:%02X:%02X:%02X:%02X",
ptr, ptr+1, ptr+2,
ptr3, ptr+4, ptr+5);
It works, but I get warnings as the expected size is int while I'm
storing onto a uint8_t array.. is there a format to store onto a
uint8_t array instead of using a int array? ( I mean to don't get any
warning)
Things are working but I hate that warnings..

They are working because you're lucky enough. "Something" tells me
that your machine is little endian. (Figuring out what this
"something" is is left as an exercise.)

Use the macro SCNx8 in <inttypes.hwhich expands to a string
literal, like this:
fscanf(file, "%02" SCNx8 ":%02" SCNx8 ":%02" SCNx8 ":%02" SCNx8
":%02" SCNx8 ":%02" SCNx8, ptr, ptr+1, ptr+2, ptr+3,
/* you didn't actually mean ptr3, did you? */, ptr+4, ptr+5);

This work due to string concatenation. For example, if SCNx8
expands to "hhx", "%02" SCNx8 ":%02" expands to "%02" "hhx" ":%02"
which is equivalent to "%02hhx:%02".
--
Army1987 (Replace "NOSPAM" with "email")
"Never attribute to malice that which can be adequately explained
by stupidity." -- R. J. Hanlon (?)
This way I don't get the warning but it doesn't seem to be working
fine as the data retrieved is wrong... (while before it was fine..)
>From what I see the printed data is totally random.
Aug 7 '07 #3

P: n/a
This way I don't get the warning but it doesn't seem to be working
fine as the data retrieved is wrong... (while before it was fine..)
From what I see the printed data is totally random.
Sorry it was my mistake... I did as you said and it worked.. as it
worked with %02hhX... why shouldn't I use this last solution instead..
as it-s reported in the man page of fscanf ?

Aug 7 '07 #4

P: n/a
On Tue, 07 Aug 2007 12:03:56 +0000, InuY4sha wrote:
>
>This way I don't get the warning but it doesn't seem to be working
fine as the data retrieved is wrong... (while before it was fine..)
>From what I see the printed data is totally random.

Sorry it was my mistake... I did as you said and it worked.. as it
worked with %02hhX... why shouldn't I use this last solution instead..
as it-s reported in the man page of fscanf ?
It works because uint8_t is unsigned char, and hhX is a conversion
specifier for unsigned char. (I think it is very unlikely that
there is a system where uint8_t exists but it is not unsigned
char, though I think the standard does allow it to be an extended
type with the same size and range, even if I can't see any
usefulness in ever doing that.)
--
Army1987 (Replace "NOSPAM" with "email")
"Never attribute to malice that which can be adequately explained
by stupidity." -- R. J. Hanlon (?)

Aug 7 '07 #5

P: n/a
InuY4sha <ri*************@gmail.comwrites:
On 7 Ago, 12:46, Army1987 <army1...@NOSPAM.itwrote:
>On Tue, 07 Aug 2007 10:11:38 +0000, InuY4sha wrote:
Hi,
I hope to be not off topic..
I have a string on a file "00:32:43:54:A2:2D" (let's say a MAC
address)
I use fscanf like this
fscanf( file, "%02X:%02X:%02X:%02X:%02X:%02X",
ptr, ptr+1, ptr+2,
ptr3, ptr+4, ptr+5);
It works, but I get warnings as the expected size is int while I'm
storing onto a uint8_t array.. is there a format to store onto a
uint8_t array instead of using a int array? ( I mean to don't get any
warning)
Things are working but I hate that warnings..
<snip>
>Use the macro SCNx8 in <inttypes.hwhich expands to a string
literal, like this:
fscanf(file, "%02" SCNx8 ":%02" SCNx8 ":%02" SCNx8 ":%02" SCNx8
":%02" SCNx8 ":%02" SCNx8, ptr, ptr+1, ptr+2, ptr+3,
/* you didn't actually mean ptr3, did you? */, ptr+4, ptr+5);
<snip>
This way I don't get the warning but it doesn't seem to be working
fine as the data retrieved is wrong... (while before it was fine..)
From what I see the printed data is totally random.
I think you'll have to post a short example of this "not working".
Ideally a full program that read the data from stdin. Often, just
trying to generate a short example of the problem, you will find out
what is wrong for yourself.

--
Ben.
Aug 7 '07 #6

P: n/a
InuY4sha <ri*************@gmail.comwrote:
I hope to be not off topic..
I'm writing this reply presuming you aren't.
I have a string on a file "00:32:43:54:A2:2D" (let's say a MAC
address)
I use fscanf like this
fscanf( file, "%02X:%02X:%02X:%02X:%02X:%02X",
ptr, ptr+1, ptr+2,
ptr3, ptr+4, ptr+5);
It works, but I get warnings as the expected size is int while I'm
storing onto a uint8_t array.. is there a format to store onto a
uint8_t array instead of using a int array? ( I mean to don't get any
warning)
If you're using uint8_t, you're using C99. If you're using C99, you
should also have <inttypes.h>. If you #include <inttypes.h(at which
point you can ditch <stdint.h>, since that is automatically included by
<inttypes.h>), you can use SCNx8. For example, instead of

fscanf(file, "%02X...", ptr);

you can use

fscanf(file, "%02" SCNx8 "...", ptr);

and so on.
<inttypes.halso defines similar macros for other sized integers, for
int_fast<foo>, int_least<bar>, intmax_t, and so on; and for the printf()
family as well as the scanf()s. Less relevantly, there are also a couple
of useful functions for dealing with (u)intmax_t.

Richard
Aug 7 '07 #7

This discussion thread is closed

Replies have been disabled for this discussion.