[En-Nut-Discussion] sscanf bug or feature ? %hx

ml mludwig at adc-elektronik.de
Thu Feb 7 21:23:28 CET 2008


Hi Alain,

in the second link you send me i found the modifier

h : short int (for d, i and n), or unsigned short int (for o, u and x)
l : long int (for d, i and n), or unsigned long int (for o, u and x), or
double (for e, f and g)
L : long double (for e, f and g)

even gccarm shows a warning : modifier h requires unsigned short int
so i think it is defined in gcc

i´m not a c-freak but i use the "%hx"  since many years with different
compilers and it gives me back
a char or short int (1 byte values) . Why do you mean it doesn´t solve my
problem ?
i can see that it works. after the modification in my example the string
isn´t destroyed and the variable ibcc contains the right value.

may be it´s better to use only integers like in all pieces of code i see in
nut.

 

Martin



Alain M. wrote:
> 
> Hi,
> 
> According to 
> <http://www.cplusplus.com/reference/clibrary/cstdio/sprintf.html>
> for sprintf the modifier "h" is for <short int> but there is not a 
> universal definition that it should be 16 bits (what should be short if 
> int is 64 bits?). This should be 16 bits in ARM
> 
> BUT in <http://www.cplusplus.com/reference/clibrary/cstdio/sscanf.html> 
> ther is no "h" modifier to scanf...
> 
> So, before adopting your modification, do you have references of this 
> modifier?
> 
> AND, anyway, it dos not justify the problem that you are getting, so 
> *something* is wrong, but we should be sure of what is wrong...
> 
> Alain
> 
> ml escreveu:
>> Hi 
>> 
>> a problem with sscanf. When using %hx i see that it isn´t working and it
>> overwrites memory
>> 
>> example
>> 
>> void test(void) {
>>   unsigned short int ibcc;
>>   char          s1[]  = "41";
>>   sscanf(s1,"%2hx",&ibcc);
>> }
>> 
>> after sscanf s1 is destroyed showing "4("and ibcc contains 0 
>> 
>> i see that getf.c doesn´t check the h modifier. function allways returns
>> int
>> or long so memory is overwriten
>> when using a char or short int.
>> 
>> 
>> 
>> i changed nut/crt/getf.c
>> to use h modifier 
>> and give back a pointer to char 
>> for this i have to introduce an new flag CF_SHORT (MSB in flags seems to
>> be
>> free for this)
>> so now it works correct. 
>> 
>> i don´t know if anyone is interested in this or how to contribute this
>> minor
>> change. 
>> 
>> Martin
>> 
>> 
>> 
> _______________________________________________
> http://lists.egnite.de/mailman/listinfo/en-nut-discussion
> 
> 

-- 
View this message in context: http://www.nabble.com/sscanf--bug-or-feature----hx-tp15309888p15342459.html
Sent from the MicroControllers - Ethernut mailing list archive at Nabble.com.




More information about the En-Nut-Discussion mailing list