Warning in data format of the fscanf function

I

InuY4sha

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
 
A

Army1987

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.h> which 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".
 
I

InuY4sha

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.h> which 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".

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..)
 
I

InuY4sha

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

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 ?
 
A

Army1987

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.)
 
B

Ben Bacarisse

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.
 
R

Richard Bos

InuY4sha said:
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.h> also 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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,754
Messages
2,569,521
Members
44,995
Latest member
PinupduzSap

Latest Threads

Top