【问题标题】:scanf not recognizing format %zuscanf 无法识别格式 %zu
【发布时间】:2020-05-24 07:39:17
【问题描述】:

我有以下代码:

#include <stdio.h>
#include <stdlib.h>

int compare(const void* a, const void* b)
{
    const int* x = a, *y = b;
    if (*x < *y)
        return -1;
    else if (*x == *y)
        return 0;
    else
        return 1;
}

int main()
{
    size_t n;
    printf("Enter number of numbers: ");
    scanf("%zu", &n); //<-- warnings here
    int numbers[n];
    for (size_t i = 0; i < n; i++)
    {
        printf("Enter number #%zu: ", i + 1); //NO warning here, printf works as expected
        scanf("%d", &numbers[i]);
    }
    qsort(numbers, n, sizeof *numbers, compare);
    for (size_t i = 0; i < n; i++)
        printf("%d ", numbers[i]);
    printf("\n");
    system("pause"); //don't comment for this, I know it's bad
}

我从 GCC 编译器收到 2 个警告:

warning: unknown conversion type character 'z' in format [-Wformat=]
warning: too many arguments for format [-Wformat-extra-args]

我已将 GCC 设置为 C11。谁能帮我理解我为什么会得到这个?

编辑:我忘了提到我的代码仍然有效,即使有这些警告,但对我来说很奇怪,变量 n 似乎没有从 scanf 获取它的值

【问题讨论】:

  • 你在用mingw吗?众所周知,MS C 运行时不支持许多 C99 功能。
  • mingw 显示这些警告。因此,如果您想使用它并具有可移植性 - 需要条件编译
  • 我正在使用 MinGW,但我不知道如何检查我的编译器版本(如果我在命令提示符下运行 gcc --version,它会显示 2.95,所以我认为不是那个)。
  • @DarkAtom 这是正确的版本。 minGW simple 不支持。
  • @DarkAtom "如果我在命令提示符下运行 gcc --version 它会显示 2.95" 2.95 于 1999 年发布!你甚至在哪里找到它?去获取这个千年的版本。 :P

标签: c scanf


【解决方案1】:

但我不知道如何检查我的编译器版本

一个常见的测试涉及__STDC__, __STDC_VERSION__。比如:

#if defined __STDC__
  #if defined __STDC_VERSION__ && __STDC_VERSION__ > 201710
    // New
    #error Time to update this code
  #elif defined __STDC_VERSION__ && __STDC_VERSION__ >= 201710
    #define CVERSION 2017
  #elif defined __STDC_VERSION__ && __STDC_VERSION__ >= 201112
    #define CVERSION 2011
  #elif defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901
    #define CVERSION 1999
  #elif defined __STDC_VERSION__ && __STDC_VERSION__ >= 199409
    #define CVERSION 1994
  #else
    #define CVERSION 1989
#else
    // Pre-standard C
    #define CVERSION 1972
#endif

“警告:格式 [-Wformat=] 中的未知转换类型字符 'z'”暗示使用旧编译器。因为"%zu" 是在 C99 中引入的。可能的条件编译。

size_t n;
printf("Enter number of numbers: ");
#if defined __STDC__ && defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901
  scanf("%zu", &n);
#else
  unsigned long t;
  scanf("%lu", &t);
  n = t;
#endif

或者用顶部的代码:

#if CVERSION >= 1999
  scanf("%zu", &n);
#else
  unsigned long t;
  scanf("%lu", &t);
  n = t;
#endif

【讨论】:

  • 显然我的编译器没有定义__STDC____STD_VERSION__201112
  • 如果编译器没有定义__STDC__,那么它不符合任何 C 标准,你只能靠你自己。
  • 对不起,我的错,没有复制粘贴您正确发布的代码。 __STDC__ 被定义为1,因此CVERSION2011
猜你喜欢
  • 1970-01-01
  • 2014-10-12
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 2018-02-15
  • 1970-01-01
  • 2018-03-21
相关资源
最近更新 更多