Why you mustn't write scanf(“%.2lf”, &a) in C?

后端 未结 2 677
萌比男神i
萌比男神i 2021-01-27 02:57

My friend have just started learning programming. He showed me his code and asked why it return some weird number. After taking a look at it, I saw that he was using sca

相关标签:
2条回答
  • 2021-01-27 03:53

    The posted code does not work because it causes undefined behavior. The . character is not a valid directive or modifier for scanf() format strings. According to §7.21.6.2 13 of the C Standard, "If a conversion specification is invalid, the behavior is undefined".

    Frighteningly, one consequence of undefined behavior may be that code appears to work, at least sometimes. But then code may fail spectacularly under different circumstances, or on different platforms. This highlights the importance of always reading the documentation for any functions being used, with special attention paid to what the Standard has to say.

    0 讨论(0)
  • 2021-01-27 03:55

    The C standard specifies that scanf conversion specifiers begin with %, and the POSIX standard specifies they begin with either % or %n$.

    Neither the C standard nor the POSIX standard allows for a . in the conversion specifier, so this character is invalid.

    You may have a decimal integer in your conversion specifier before the type specifier, but it specifies the maximum field width of the type. This means that scanf will read at most 2 characters before stopping when passed %2lf.

    Additionally, lf specifies that the value should be a double, so a should be of type double.

    0 讨论(0)
提交回复
热议问题