scanf int8_t损坏堆栈

scanf int8_t corrupts stack

本文关键字:损坏 堆栈 int8 scanf      更新时间:2023-10-16

如何在没有此错误的情况下扫描INT8_T和其他类型。我使用" cinttypes"来获取模式的常数,但这无济于事。

#include <cstdio>
#include <cstdint>
#include <cinttypes>
int main()
{
    int8_t var;
    scanf("%" SCNi8, &var);
    printf("%" PRIi8 "n", var);
    return 0;
}

P.S。此错误仅在调试中发生,在发行版中可以。

P.P.S。输出为:

1>------ Build started: Project: SCANF_PROBLEM, Configuration: Debug Win32 ------
1>  SCANF_PROBLEM.cpp
1>d:studyscanf_problemscanf_problemscanf_problem.cpp(11): warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>          d:visual studiovcincludestdio.h(283) : see declaration of 'scanf'
1>  SCANF_PROBLEM.vcxproj -> D:StudySCANF_PROBLEMDebugSCANF_PROBLEM.exe
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

即使在C99中,这些扩展的整数类型也不需要存在,除非文档说它们存在,否则以后会详细介绍……即使这些扩展的整数类型确实存在,不需要具有scanf格式指定符。有关此报价,请参见N1256第7.8.1p6节:

对于实现在<stdint.h>中提供的每种类型,相应的 fprintf宏应定义,相应的fscanf宏应为 除非实现没有合适的fscanf长度修饰符,否则已定义 类型。

至于C ,好吧... C 11委托<cstdint>本质上应为C99S <stdint.h>的包装器,并且其函数是指C99等效物的包装器。

这是踢球者:微软从未关心过C99的所有内容,以至于他们愿意记录" N/A"以进行扩展整数支持。

确保您的编译器被配置为COMPILER为C99或更高版本,或C 11或更高版本,并链接到C99-或兼容的标准库。SCNi8可能存在于标题中,但是如果scanf不支持它(在C99/C 11合规性之前不会支持它),那么您将不会有任何运气...当然,确保您的标准库文档支持您打算使用的实现定义的功能。

protip:如果您的文件名以.C结束,则Microsoft Visual Studio将尝试将代码编译为C89。这可能不会有帮助。MSVC 的C99符合标准库的符合性也不太好,即使您告诉将其编译为C 11。您可能应该学习如何确定您正在使用的编译器/库版本...在学习如何使用命令行编译时。

Protip#2:您可以在Visual Studio中使用LLVM/Clang。确保您链接到符合C99的标准库(例如Microsoft)。

Protip#3:使用printf ...

时,您可能需要更改PRIi8SCNi8

protip#4:有关此报价,请参见脚注191:

C 实现只能在定义__STDC_FORMAT_MACROS时定义这些宏 在包括<inttypes.h>之前。

您已经遇到了Microsoft的C/C 运行时库的错误。http://mfctips.com/tag/format/或https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63417(在Mingw下报告了GCC的此错误,该错误链接了Microsft Libs)。

"%HHD"只是不起作用;您必须围绕它进行编程(这并不难过,但可悲)。

我不知道向MS的错误报告(即,当我尝试使用Google时,我什么都没看到)。