2015-05-18 142 views
4

如何scanf int8_t和其他类型没有此错误。我使用“cinttypes”来获取模式的常量,但这并没有帮助。scanf int8_t损坏堆栈

#include <cstdio> 
#include <cstdint> 
#include <cinttypes> 

int main() 
{ 
    int8_t var; 
    scanf("%" SCNi8, &var); 
    printf("%" PRIi8 "\n", var); 
    return 0; 
} 

P.S.这个错误仅在调试中发生,当在Release中构建时它是OK的。

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 ========== 
+0

为什么引号外的'SCNi8'? –

+1

@DavidHoelzer它是一个字符串文字。相邻的字符串文字是连接的。 –

+0

大卫,我在使用%hhi的例子中播种,显然没有帮助。 –

回答

1

您已经遇到微软C/C++运行时库的错误,请参阅参考资料。http://mfctips.com/tag/format/https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63417(它在mingw下面报告这个gcc的bug,它与Microsft库链接)。

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

我不知道MS的错误报告(即,我没有看到任何东西,当我试图谷歌它)。

+0

我希望得到详细的反馈意见,为了学习和为了提高质量,我会最自相矛盾地欣赏负面反馈。 (目前我确信答案是正确的,其中描述的MS错误是OP的麻烦原因。) –

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合规性之前它不会支持它),那么你将不会有任何运气......当然,确保您的标准库文档支​​持您打算使用的实现定义的功能。原始码:如果您的文件名以.c结尾,Microsoft Visual Studio将尝试将您的代码编译为C89。这可能不会有帮助。即使您将它作为C++ 11进行编译,MSVC++在标准库方面的C99遵从性也不算太好。您应该学习如何确定使用哪种编译器/库版本......而您正在学习如何使用命令行进行编译。

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

普罗蒂普#3:您可能需要使用printf何时改变SCNi8PRIi8 ...

普罗蒂普#4:这句话见footnote 191

C++实现应仅在定义这些宏在包括<inttypes.h>之前,__STDC_FORMAT_MACROS被定义为 。