scanf не распознает формат% zu - PullRequest
0 голосов
/ 08 февраля 2020

У меня есть следующий код:

#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
}

Я получаю 2 предупреждения от моего компилятора G CC:

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

Я установил G CC на C11. Кто-нибудь может помочь мне понять, почему я получаю это?

РЕДАКТИРОВАТЬ: я забыл упомянуть, что мой код все еще работает, даже с этими предупреждениями, однако это очень странно, поскольку мне кажется, что переменная n не получает его значение из scanf

1 Ответ

0 голосов
/ 08 февраля 2020

но я не знаю, как проверить версию моего компилятора

Обычный тест включает __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

"предупреждение: неизвестный символ типа преобразования 'z' в формате [-Wformat =]" подразумевает использование старого компилятора. Как "%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
...