2014-10-22 42 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運行它