【问题标题】:Getting weird result by using %I64u inside Mingw-w64在 Mingw-w64 中使用 %I64u 得到奇怪的结果
【发布时间】:2014-10-22 02:38:56
【问题描述】:

这是我的代码:

注意:在 scanf 中的 \n 是我防止尾随换行问题的方法。这不是最好的解决方案,但我使用它太多了,目前它已成为我的习惯。 :-)

...

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

【问题讨论】:

  • printf 的例子中可以看出g++ 不支持I64 修饰符。
  • @RaymondChen,我已经看过了,但是我对 I64u 输出感到困惑,因此我创建了这个新问题。谢谢你帮我弄清楚这件事。 :-)
  • 使用非标准说明符会导致未定义的行为;解决这个使用%llu.
  • @MattMcNabb,这是我使用%llu的结果,输入都是89,输出是25769968512 2337536

标签: c++ windows printf scanf


【解决方案1】:

这段代码是错误的:

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

input[0]input[1] 都具有 unsigned long long 类型,但对于 scanf 操作,它们必须具有 unsigned long long * 类型(指针 指向 unsigned long long)。我不确定 MinGW 是否支持检查 printfscanf 格式说明符,但普通的 GCC 能够在编译时检测到这些类型的错误只要启用正确的警告。我强烈建议始终使用尽可能高的警告级别进行编译,例如在最极端的情况下使用-Wall -Wextra -Werror -pedantic

你需要传入这些变量的地址

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

【讨论】:

  • 非常感谢!!顺便说一句,我之前没有注意到这一点,对于 G++,我使用的是%llu 而不是%64u,它对我有用。 :-D
【解决方案2】:

我怀疑您一直在使用 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

最后,令人讨厌的是,由于 mintty 不是正确的 Windows 控制台,您的示例在从 MSYS2 shell 启动时不起作用;你需要从 cmd.exe 运行它

【讨论】:

    猜你喜欢
    • 2020-12-15
    • 2022-01-25
    • 2020-10-08
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多