Format specifiers for uint8_t, uint16_t, …?

后端 未结 7 1489
执念已碎
执念已碎 2020-11-30 20:26

If I have an integer variable I can use sscanf as shown below by using the format specifier %d.

sscanf (line, \"Value of integer: %d\\n\", &         


        
相关标签:
7条回答
  • 2020-11-30 21:08

    The right format to read a uint64_t (typedef unsigned long long int) is, with scanf and not sscanf, "%" SCNu64 and for print is also SCNu64 Example. in your code you read for example my_integer variable, then you do scanf ("Value of integer:%" SCNu64, & my_integer); and to write the same but with printf.

    0 讨论(0)
  • 2020-11-30 21:12

    Refer to this for sscanf usage.

    These datatypes are defined in stdint.h. Refer here for stdint.h

    Shash

    0 讨论(0)
  • 2020-11-30 21:22

    According to 7.19.6 Formatted input/output functions of ISO/IEC 9899:TC2, there are no such format specifiers (so I doubt there any for C++2003). Even though there are some #define-macros available in C99's inttypes.h, cinttypes and inttypes.h are not part of the current standard. Of course, fixed-size integer types are non-standard as well.

    Anyways, I seriously recommemend using streams instead:

    <any_type> x;
    f >> x;
    

    and be done. E.g.:

    std::stringstream ss;
    uint32_t u;
    std::cin >> u;
    

    This has the advantage that one time in the future, changing the type of the variable does not cause a cascade of subtle bugs and undefined behaviour.

    0 讨论(0)
  • 2020-11-30 21:27

    In C, the header is <inttypes.h>, and formats such as SCNX8, SCNd16.

    The same header probably works for C++ too.

    0 讨论(0)
  • 2020-11-30 21:27

    You can check types in <cstdint> for C++ or in <types.h> for C. Then you can specify format which is currently compiled on your machine. If variable is unsigned then you need to use %u, if variable is signed, then use %d. For variables size lower than 32 bytes you don't have to specify long prefix.

    In my configuration I have 64 bit program, so my uint64_t is compiled as unsigned long long int, so it means to use %llu. If your program will be compiled in 32 bit you can use %lu because uint64_t will be compiled as unsigned long int

    But who is using x86 still? :), so generally:

    uint8_t, uint16_t, uint32_t - %u
    uint64_t - %llu
    int8_t, int16_t, int32_t - %d
    int64_t -%lld
    
    0 讨论(0)
  • 2020-11-30 21:28

    They are declared in <inttypes.h> as macros: SCNd8, SCNd16, SCNd32 and SCNd64. Example (for int32_t):

    sscanf (line, "Value of integer: %" SCNd32 "\n", &my_integer);
    

    Their format is PRI (for printf)/SCN (for scan) then o, u, x, X d, i for the corresponding specifier then nothing, LEAST, FAST, MAX then the size (obviously there is no size for MAX). Some other examples: PRIo8, PRIuMAX, SCNoFAST16.

    Edit: BTW a related question asked why that method was used. You may find the answers interesting.

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