这是我的代码:
注意:\ n scanf内部是我防止追踪换行问题的方法。这不是最佳解决方案,但我使用它太多,目前它已成为我的习惯。 : - )
...
int main()
{
unsigned long long int input[2], calc_square;
while(scanf("\n%I64u %I64u", input[0], input[1]) == 2)
{
printf("%I64u %I64u\n", input[0], input[1]);
...
我的预期输入和程序结果是:
输入:
89 89
对于输出,它显示此输出而不是打印89:
I64u I64u
我在MSYS2包中使用g ++(GCC)4.9.1。注意到g ++,因为我的代码中有一部分当前正在使用C ++ STL。
编辑:我使用标准%llu
代替%I64u
更改了代码,这是我预期的输入和程序结果:
输入
89 89
对于输出,它是一种奇怪的结果:
25769968512 2337536
答案 0 :(得分:1)
此代码错误:
while(scanf("\n%I64u %I64u", input[0], input[1]) == 2)
input[0]
和input[1]
每个都有unsigned long long
类型,但要求类型unsigned long long *
(指针到unsigned long long
)scanf
操作。我不确定MinGW是否支持检查printf
和scanf
格式说明符,但普通GCC能够在编译时检测到这类错误,只要您启用正确的警告< / strong>即可。我强烈建议您尽可能使用尽可能高的警告级别进行编译,例如最极端情况下的-Wall -Wextra -Werror -pedantic
。
您需要传递这些变量的地址:
while(scanf("\n%I64u %I64u", &input[0], &input[1]) == 2)
// ^ ^
// | |
答案 1 :(得分:0)
我怀疑你一直在使用MSYS2的GCC,它不是原生的Windows编译器,并且不支持MS特定的%I64格式修饰符(MSYS2的GCC非常像Cygwin的GCC)。
如果您想使用MinGW-w64 GCC,您应该已经启动了mingw64_shell.bat或mingw32_shell.bat并安装了相应的工具链:
pacman -S mingw-w64-i686-toolchain
或
pacman -S mingw-w64-x86_64-toolchain
完成后,您可以安全地在任何Windows版本上使用任一修饰符,这些版本可追溯到Windows XP SP3 提供您传递-D__USE_MINGW_ANSI_STDIO = 1。
FWIW,我避免使用特定于MS的修饰符并始终传递-D__USE_MINGW_ANSI_STDIO = 1
最后,令人讨厌的是,你的样本在从MSYS2 shell启动时不起作用,因为它不是一个合适的Windows控制台;你需要从cmd.exe运行它