如何在没有此错误的情况下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 ==========
答案 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的错误报告(即,当我尝试谷歌时,我没有看到任何内容)。