Где определен буфер scanf_s ()? - PullRequest
0 голосов
/ 27 июня 2018

Если бы у меня не было доступа к Интернету, но я знал, что хочу использовать функцию scanf_s() для получения ввода с клавиатуры (stdin), как я узнаю, где объявить буфер?

В тот момент, когда я вхожу в функцию scanf_s() в Visual Studio, я вижу это:

#if __STDC_WANT_SECURE_LIB__

    _Check_return_opt_
    _CRT_STDIO_INLINE int __CRTDECL scanf_s(
        _In_z_ _Scanf_s_format_string_ char const* const _Format,
        ...)
#if defined _NO_CRT_STDIO_INLINE // SCANF
    ;

Итак, я вижу, что scanf_s() принимает 1 определенный аргумент (char const * _Format), который, в данном случае, может быть некоторым заполнителем, таким как be "%s", но ничего для второго аргумента - адреса памяти буфер для хранения результатов сканирования.

1 Ответ

0 голосов
/ 27 июня 2018

scanf_s принимает переменный список аргументов. Первый аргумент является обязательным, строка со спецификациями преобразования, следующие аргументы зависят от того, какие спецификации преобразования присутствуют в строке формата.

Для каждой спецификации преобразования %s, %c и %[, scanf_s ожидает 2 аргумента для преобразования: указатель на char (char *) и число, переданное с типом rsize_t, которое указывает размер массива, на который указывает аргумент char *.

Вот пример:

#define __STDC_WANT_LIB_EXT1__ 1 
#include <stdio.h>

int main() {
    char buf[32];
    int res;

    printf("Type a word: ");
    res = scanf_s("%s", buf, sizeof(buf));
    switch (res) {
    case EOF:
        printf("Input failure\n");
        break;
    case 0:
        printf("Matching failure\n");
        break;
    case 1:
        printf("Success: you typed '%s'\n", buf);
        break;
    default:
        printf("Unexpected return value %d\n", res);
        break;
    }
    return 0;
}

Обратите внимание, однако, что поддержка scanf_s далеко не универсальна. Платформы Microsoft обычно поддерживают это, но с различной семантикой, в то время как библиотеки Linux и Mac C обычно этого не делают. Прочитайте этот вопрос, чтобы понять Почему gcc не реализовал функции _s?

...