gpt4 book ai didi

c - scanf 正在覆盖第二个变量

转载 作者:太空狗 更新时间:2023-10-29 15:17:19 25 4
gpt4 key购买 nike

我要求用户输入两个变量。第一个是无符号整数 a,第二个是无符号字符 b。读入a正常,但是读入b后,a为0。

我发现指向a 的指针比指向b 的指针大1。我意识到当 b 大于 255 时,a 不再是 0。所以在我看来,scanfb 读取了一个以上的字节并覆盖了 a

#include <stdio.h>

int main ()
{
unsigned int a;
unsigned char b;

printf("a: ");
scanf("%u", &a); /* 255 */
printf("b: ");
scanf("%hhu", &b); /* 17 */

printf("a: %u\n", a); /* a: 0 */
printf("b: %u\n", b); /* b: 17 */

printf("pointer a: %u\n", &a); /* pointer a: 6422316 */
printf("pointer b: %u\n", &b); /* pointer b: 6422315 */

return 0;
}

由于我是 C 语言编程的新手,我不确定需要哪些信息才能理解我的问题。我使用的是 64 位处理器,这是使用的编译器:

gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/8.2.0/lto-wrapper.exe
Target: mingw32
Configured with: ../src/gcc-8.2.0/configure --build=x86_64-pc-linux-gnu --host=mingw32 --target=mingw32 --prefix=/mingw --disable-win32-registry --with-arch=i586 --with-tune=generic --enable-languages=c,c++,objc,obj-c++,fortran,ada --with-pkgversion='MinGW.org GCC-8.2.0-3' --with-gmp=/mingw --with-mpfr=/mingw --with-mpc=/mingw --enable-static --enable-shared --enable-threads --with-dwarf2 --disable-sjlj-exceptions --enable-version-specific-runtime-libs --with-libiconv-prefix=/mingw --with-libintl-prefix=/mingw --enable-libstdcxx-debug --with-isl=/mingw --enable-libgomp --disable-libvtv --enable-nls --disable-build-format-warnings
Thread model: win32
gcc version 8.2.0 (MinGW.org GCC-8.2.0-3)

最佳答案

问题出在这一行:

    scanf("%hhu", &b); /* 17 */

Microsoft 的 C 运行时库没有实现 %hhu(它不是 C99 之前的 C 标准的一部分)。这导致输入被解释为 short(由于 MSVCRT 如何在格式说明符中将 hh 解释为 h),并写入b 的限制并覆盖 a 的部分内容。

要解决此问题,请将 a 的类型更改为 unsigned short 并使用 %hu 作为格式说明符或传递 -D__USE_MINGW_ANSI_STDIO 标记给你的编译器。

关于c - scanf 正在覆盖第二个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56277717/

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