How to use int16_t or int32_t with functions like scanf

27,318

For those you need to use the macros from inttypes.h such as SCNd64 or SCNu32 etc.

scanf("%" SCNd32, &x);
Share:
27,318

Related videos on Youtube

guribe94
Author by

guribe94

Updated on July 09, 2022

Comments

  • guribe94
    guribe94 almost 2 years

    The way that I understand int16_t or int32_t in C is that they are typedefed to be 16 and 32 bit numbers respectively on your computer. I believe you would use these when you need to guarentee a number is 16 or 32 bits because different systems do not always represent an int as 32 bits or a short as 16 bits (Is this assumption correct? I find mixed answers when I look online.).

    My question is how would I use a function like scanf to get input from a user with a int16_t or a int32_t or any of the other typedefed number types when I require them to actually be 16 bits or 32 bits or whatever? Is there some sort of special string modifier? Normally if I wanted to get an int from a user without caring about how large it is actually represented as I would write something like this

    scanf("%d", &int);
    

    This works if I pass in a int32_t but I assume it is only because an int on my system is 32 bits and it does not specifically give me a 32 bit number instead it just gives me an int. How would I go about getting number that is guarenteed to be 32 bits? I have looked on this page of string modifiers and a few other places but have found no mention of these typedefed number types.

    Edit: Since receiving an answer to my question I have done some Googling and found this. I included it below for reference as well.

    uppercase hexadecimal printf format for uintptr_t
    
    #define SCNd16   "d"
    decimal scanf format for int16_t
    
    #define SCNd32   "ld"
    decimal scanf format for int32_t
    
    #define SCNd8   "hhd"
    decimal scanf format for int8_t
    
    #define SCNdFAST16   "d"
    decimal scanf format for int_fast16_t
    
    #define SCNdFAST32   "ld"
    decimal scanf format for int_fast32_t
    
    #define SCNdFAST8   "hhd"
    decimal scanf format for int_fast8_t
    
    #define SCNdLEAST16   "d"
    decimal scanf format for int_least16_t
    
    #define SCNdLEAST32   "ld"
    decimal scanf format for int_least32_t
    
    #define SCNdLEAST8   "hhd"
    decimal scanf format for int_least8_t
    
    #define SCNdPTR   SCNd16
    decimal scanf format for intptr_t
    
    #define SCNi16   "i"
    generic-integer scanf format for int16_t
    
    #define SCNi32   "li"
    generic-integer scanf format for int32_t
    
    #define SCNi8   "hhi"
    generic-integer scanf format for int8_t
    
    #define SCNiFAST16   "i"
    generic-integer scanf format for int_fast16_t
    
    #define SCNiFAST32   "li"
    generic-integer scanf format for int_fast32_t
    
    #define SCNiFAST8   "hhi"
    generic-integer scanf format for int_fast8_t
    
    #define SCNiLEAST16   "i"
    generic-integer scanf format for int_least16_t
    
    #define SCNiLEAST32   "li"
    generic-integer scanf format for int_least32_t
    
    #define SCNiLEAST8   "hhi"
    generic-integer scanf format for int_least8_t
    
    #define SCNiPTR   SCNi16
    generic-integer scanf format for intptr_t
    
    #define SCNo16   "o"
    octal scanf format for uint16_t
    
    #define SCNo32   "lo"
    octal scanf format for uint32_t
    
    #define SCNo8   "hho"
    octal scanf format for uint8_t
    
    #define SCNoFAST16   "o"
    octal scanf format for uint_fast16_t
    
    #define SCNoFAST32   "lo"
    octal scanf format for uint_fast32_t
    
    #define SCNoFAST8   "hho"
    octal scanf format for uint_fast8_t
    
    #define SCNoLEAST16   "o"
    octal scanf format for uint_least16_t
    
    #define SCNoLEAST32   "lo"
    octal scanf format for uint_least32_t
    
    #define SCNoLEAST8   "hho"
    octal scanf format for uint_least8_t
    
    #define SCNoPTR   SCNo16
    octal scanf format for uintptr_t
    
    #define SCNu16   "u"
    decimal scanf format for uint16_t
    
    #define SCNu32   "lu"
    decimal scanf format for uint32_t
    
    #define SCNu8   "hhu"
    decimal scanf format for uint8_t
    
    #define SCNuFAST16   "u"
    decimal scanf format for uint_fast16_t
    
    #define SCNuFAST32   "lu"
    decimal scanf format for uint_fast32_t
    
    #define SCNuFAST8   "hhu"
    decimal scanf format for uint_fast8_t
    
    #define SCNuLEAST16   "u"
    decimal scanf format for uint_least16_t
    
    #define SCNuLEAST32   "lu"
    decimal scanf format for uint_least32_t
    
    #define SCNuLEAST8   "hhu"
    decimal scanf format for uint_least8_t
    
    #define SCNuPTR   SCNu16
    decimal scanf format for uintptr_t
    
    #define SCNx16   "x"
    hexadecimal scanf format for uint16_t
    
    #define SCNx32   "lx"
    hexadecimal scanf format for uint32_t
    
    #define SCNx8   "hhx"
    hexadecimal scanf format for uint8_t
    
    #define SCNxFAST16   "x"
    hexadecimal scanf format for uint_fast16_t
    
    #define SCNxFAST32   "lx"
    hexadecimal scanf format for uint_fast32_t
    
    #define SCNxFAST8   "hhx"
    hexadecimal scanf format for uint_fast8_t
    
    #define SCNxLEAST16   "x"
    hexadecimal scanf format for uint_least16_t
    
    #define SCNxLEAST32   "lx"
    hexadecimal scanf format for uint_least32_t
    
    #define SCNxLEAST8   "hhx"
    hexadecimal scanf format for uint_least8_t
    
    #define SCNxPTR   SCNx16
    hexadecimal scanf format for uintptr_t
    
    • BLUEPIXY
      BLUEPIXY over 9 years
      for int16_t : scanf("%" SCNd16 , &var), for int32_t : scanf("%" SCNd32 , &var). #include <inttypes.h>
    • Uyghur Lives Matter
      Uyghur Lives Matter over 9 years
      @PaulGriffiths This is close, but not an actual duplicate. The subtle difference is that printf should use the PRI* macros while scanf should use SCN* macros.
    • Kevin Chen
      Kevin Chen over 6 years
      Note that the above is for avr-gcc, a version of gcc for microcontrollers. The specific definitions for your platform will likely be different. On Linux, you can find the SCN... macros in /usr/include/inttypes.h.
  • nowox
    nowox over 4 years
    Is this part of the C99 standard?