gpt4 book ai didi

c - scanf 将整数输入读取到 uint8_t 中

转载 作者:行者123 更新时间:2023-12-01 22:37:47 24 4
gpt4 key购买 nike

有没有办法使用 scanf 将无符号字符十进制输入读取到 uint8_t 变量中?

我担心如果我将 %hu 或 %u 读入 uint8_t,可能会损坏相邻内存,因为 uint8_t 是 1 个字节,但 %hu 是 2 个字节,%u 是 4 个字节。

我使用的是MinGW32

gcc.exe (GCC) 4.9.3
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

我担心的代码:

/* worried.c - issue demo code. */
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

int main(int argc, char **argv)
{
uint8_t filler1 = 17; /* do not corrupt me please. */
uint8_t my_mem;
uint8_t filler2 = 39; /* do not corrupt me please. */

printf("please enter a number: $ ");
scanf("%u", &my_mem); /* corrupts fillers... */
// scanf("%hu", &my_mem); /* this also corrupts... */
// scanf("%hhu", &my_mem); /* still corrupts... */
// scanf("%"SCNu8, &my_mem); /* still corrupts... */
// scanf("%"PRIu8 "\n", &my_mem); /* still corrupts... */

printf("filler1 = %u.\n", filler1);
printf("my_mem = %u.\n", my_mem);
printf("filler2 = %u.\n", filler2);

return 0;
}

请注意,上面的代码确实损坏了填充符,这在读入稍后将直接写入二进制(记录)文件的结构时是灾难性的。

我可以通过从临时变量进行转换来解决这个问题,但这需要我的程序做一些额外的工作,我想知道是否可以避免强制我的程序这样做,并直接读入 my_mem。

迄今为止,最有可能的解决方案似乎是:

The only way to portably do this that works on GCC4.9.3 and newer is through casting. There are more elegant solutions on GCC5.2 e.g. %hhu, but they misbehave on GCC4.9.3.

最佳答案

使用兼容的编译器,请使用 SCNu8 @BLUEPIXY

#include <stdint.h>
#include <inttypes.h>

if (1 == scanf("%" SCNu8, &my_mem)) Oh_happy_day();

使用较小的编译器,获取新的编译器或使用 OP 都知道的内容。

unsigned u; 
if (1 == scanf("%u", u)) {
my_mem = u;
Oh_somewhat_happy_day();
}

或者自己定义SCNu8(它是一个宏)

#include <stdint.h>
#include <inttypes.h>
#ifndef SCNu8
#define SCNu8 "hhu"
#endif

if (1 == scanf("%" SCNu8, &my_mem)) Oh_happy_day_again();

关于c - scanf 将整数输入读取到 uint8_t 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36191212/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com