通过在Mingw-w64中使用%I64u获得奇怪的结果

时间:2014-10-22 02:38:57

标签: c++ windows printf scanf

这是我的代码:

注意:\ 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

2 个答案:

答案 0 :(得分:1)

此代码错误:

while(scanf("\n%I64u %I64u", input[0], input[1]) == 2)

input[0]input[1]每个都有unsigned long long类型,但要求类型unsigned long long *指针unsigned long longscanf操作。我不确定MinGW是否支持检查printfscanf格式说明符,但普通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运行它