2014-10-22 17 views
0

内怪异的结果这是我的代码:获得通过使用%I64u的MinGW-W64

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

我使用g ++(GCC)4.9.1从MSYS2包。注意到g ++,因为我的代码的一部分目前正在使用C++ STL。


编辑:我使用标准%llu代替%I64u改变了我的代码,这是我期望的输入和程序结果:

输入

89 89 

对于输出,它是一种奇怪的结果:

25769968512 2337536 
+0

从'printf'示例中,应该清楚g ++不支持'I64'修饰符。 – 2014-10-22 02:46:38

+0

[Printf long long int in C with GCC?](http://stackoverflow.com/questions/13590735/printf-long-long-int-in-c-with-gcc) – 2014-10-22 02:48:17

+0

@RaymondChen,我已经看看这个,但是我对I64u的输出感到困惑,因此我创建了这个新问题。谢谢你为我清除这件事。 :-) – 2014-10-22 02:50:31

回答

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是否支持检查printfscanf格式说明符,但只要您启用适当的警告,普通GCC就能够在编译时检测这些类型的错误。我强烈建议您尽可能使用最高级别的警告级别进行编译,例如在极端情况下使用-Wall -Wextra -Werror -pedantic

您需要在地址这些变量的经过:

while(scanf("\n%I64u %I64u", &input[0], &input[1]) == 2) 
//       ^  ^
//       |   | 
+0

非常感谢!我没有注意到这很早,BTW,G ++,我使用'%llu'而不是'%64u',它对我很有用。 :-D – 2014-10-22 03:34:14

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 XP SP3的Windows版本上使用修饰符提供的您传递-D__USE_MINGW_ANSI_STDIO = 1。

FWIW,我避免使用MS不同的改性剂和总是传递-D__USE_MINGW_ANSI_STDIO = 1

最后,烦人,你的样品不从MSYS2外壳启动时,由于mintty不是一个适当的Windows控制台工作;您需要从cmd.exe运行它