scanf int8_t破坏了堆栈

时间:2015-05-18 11:53:06

标签: c++ visual-studio-2013 scanf

如何在没有此错误的情况下scanf 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。这个错误只发生在Debug中,当在Release中构建它没关系时。

P.P.S。输出是:

1>------ Build started: Project: SCANF_PROBLEM, Configuration: Debug Win32 ------
1>  SCANF_PROBLEM.cpp
1>d:\study\scanf_problem\scanf_problem\scanf_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 studio\vc\include\stdio.h(283) : see declaration of 'scanf'
1>  SCANF_PROBLEM.vcxproj -> D:\Study\SCANF_PROBLEM\Debug\SCANF_PROBLEM.exe
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

2 个答案:

答案 0 :(得分:2)

即使在C99中,也不需要存在那些扩展的整数类型,除非文档说它们存在,稍后会更多......即使这些扩展整数类型确实存在,它们也不需要拥有scanf格式说明符。有关此引用,请参阅n1256 section 7.8.1p6

  

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

至于C ++,那么...... C ++ 11委托<cstdint>基本上是C99s <stdint.h>的包装器,它所引用的函数是C99等价物的包装器。

以下是解决方案:例如,微软从未关注C99,只有they're willing to document "N/A" for extended integer support

确保将编译器配置为编译为C99或更高版本,或C ++ 11或更高版本,并链接到符合C99或更高版本的标准库。标题中可能存在SCNi8,但如果scanf不支持它(它在C99 / C ++ 11合规性之前赢了),那么你就赢了。祝你好运......当然,确保您的标准库文档支​​持您打算使用的实现定义的功能

Protip:如果您的文件名以.c结尾,Microsoft Visual Studio将尝试将您的代码编译为C89。这可能不会有所帮助。即使你告诉它编译为C ++ 11,MSVC ++在标准库方面的C99兼容性也不算太高。您可能应该学习如何确定您正在使用的编译器/库版本......当您学习如何使用命令行进行编译时。

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

Protip#3:使用SCNi8时,您可能希望更改PRIi8的{​​{1}} ...

Protip#4:有关此引用,请参阅footnote 191

  

只有在定义printf时,C ++实现才应定义这些宏   在包含__STDC_FORMAT_MACROS之前。

答案 1 :(得分:1)

您遇到了Microsoft的C / C ++运行时库的错误,参见http://mfctips.com/tag/format/https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63417(在mingw下报告gcc的这个bug,它链接到Microsft库)。

“%hhd”只是不起作用;你必须围绕它编程(这不是太难,但很难过)。

我不知道有关MS的错误报告(即,当我尝试谷歌时,我没有看到任何内容)。