Spec-Zone.ru › C

wscanf, fwscanf, swscanf, wscanf_s, fwscanf_s, swscanf_s

Определено в заголовке <wchar.h>
(1)
int wscanf( const wchar_t *format, ... );
(с C95)
(до C99)
int wscanf( const wchar_t *restrict format, ... );
(с C99)
(2)
int fwscanf( FILE *stream, const wchar_t *format, ... );
(с C95)
(до C99)
int fwscanf( FILE *restrict stream,
             const wchar_t *restrict format, ... );
(с C99)
(3)
int swscanf( const wchar_t *buffer, const wchar_t *format, ... );
(с C95)
(до C99)
int swscanf( const wchar_t *restrict buffer,
             const wchar_t *restrict format, ... );
(с C99)
int wscanf_s( const wchar_t *restrict format, ...);
(4) (с C11)
int fwscanf_s( FILE *restrict stream,
               const wchar_t *restrict format, ...);
(5) (с C11)
int swscanf_s( const wchar_t *restrict s,
               const wchar_t *restrict format, ...);
(6) (с C11)

Считывает данные из различных источников, интерпретирует их согласно format и сохраняет результаты в заданные места.

1) Считывает данные из stdin.
2) Считывает данные из потока файла stream.
3) Считывает данные из строки широких символов с нулевым завершением buffer. Достижение конца строки эквивалентно достижению условия конца файла для fwscanf
4-6) Аналогично (1-3), за исключением того, что %c, %s, и %[ спецификаторы преобразования ожидают по два аргумента (обычный указатель и значение типа rsize_t , указывающее размер принимающего массива, которое может быть 1 при чтении с %lc в один широкий символ), и за исключением того, что следующие ошибки обнаруживаются во время выполнения и вызывают установленную в данный момент функцию обработчика ограничений обработчик ограничений:
  • любой из аргументов типа указатель является нулевым указателем
  • format, stream, или buffer является нулевым указателем
  • количество символов, которое будет записано %c, %s, или %[, плюс завершающий нулевой символ, превысило бы второй (rsize_t) аргумент, предоставленный для каждого из этих спецификаторов преобразования
  • необязательно, любая другая обнаруживаемая ошибка, например, неизвестный спецификатор преобразования
Как и все функции с проверкой границ, wscanf_s, fwscanf_s, и swscanf_s гарантированы только в том случае, если __STDC_LIB_EXT1__ определена реализацией, и если пользователь определяет __STDC_WANT_LIB_EXT1__ как целочисленную константу 1 перед включением <wchar.h>.

Параметры

stream - входной поток файла для чтения
buffer - указатель на строку широких символов с нулевым завершением для чтения
format - указатель на строку широких символов с нулевым завершением, определяющая способ чтения входных данных
... - аргументы получения.


Строка format состоит из

  • широких символов без пробелов, за исключением %: каждый такой символ в строке format потребляет ровно один идентичный символ из входного потока или заставляет функцию завершиться неудачей, если следующий символ в потоке не совпадает.
  • пробельных символов: любой одиночный пробельный символ в строке format потребляет все доступные последовательные пробельные символы из входного потока (определяемые так, как если бы вызывали iswspace в цикле). Обратите внимание, что нет разницы между "\n", " ", "\t\t", или другими пробелами в строке format.
  • спецификаций преобразования. Каждая спецификация преобразования имеет следующий формат:
    • вводящий % символ.
    • (необязательно) символ подавления присваивания *. Если этот вариант присутствует, функция не присваивает результат преобразования ни одному аргументу получения.
    • (необязательно) целое число (больше нуля), которое задаёт максимальную ширину поля, то есть максимальное количество символов, которое функция разрешено использовать при выполнении преобразования, указанного текущей спецификацией преобразования. Обратите внимание, что %s и %[ могут привести к переполнению буфера, если ширина не задана.
    • (необязательно) модификатор длины, который указывает размер аргумента получения, то есть фактический тип назначения. Это влияет на точность преобразования и правила переполнения. По умолчанию тип назначения отличается для каждого типа преобразования (см. таблицу ниже).
    • спецификатор формата преобразования.

Доступны следующие спецификаторы формата:

Спецификатор преобразования
Описание Тип аргумента
Модификатор длины → hh

(C99)

h (нет) l ll

(C99)

j

(C99)

z

(C99)

t

(C99)

L
% Соответствует литералу %. Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д
c Соответствует символу или последовательности символов.

Если используется спецификатор ширины, соответствует ровно ширине символов (аргумент должен быть указателем на массив с достаточным пространством). В отличие от %s и %[, не добавляет нулевой символ в массив.

Н/Д Н/Д
char*
wchar_t*
Н/Д Н/Д Н/Д Н/Д Н/Д
s Соответствует последовательности символов без пробелов (строке).

Если используется спецификатор ширины, соответствует до ширины или до первого символа пробела, что произойдет раньше. Всегда сохраняет нулевой символ в дополнение к сопоставленным символам (поэтому массив аргументов должен иметь место для по крайней мере ширина+1 символов)

[множество] Соответствует непустой последовательности символов из множества символов.

Если первый символ множества — ^, то сопоставляются все символы, не входящие в множество. Если множество начинается с ] или ^], то символ ] также включается в множество. Реализуется ли символ - в неначальной позиции в наборе сканирования, указывающий на диапазон, как в [0-9], определяется реализацией. Если используется спецификатор ширины, соответствует только до ширины. Всегда сохраняет нулевой символ в дополнение к сопоставленным символам (поэтому массив аргументов должен иметь место для по крайней мере ширина+1 символов)

d Соответствует десятичному целому числу.

Формат числа такой же, как ожидается функцией wcstol со значением 10 для аргумента base

signed char* или unsigned char*
signed short* или unsigned short*
signed int* или unsigned int*
signed long* или unsigned long*
signed long long* или unsigned long long*
intmax_t* или uintmax_t*
size_t*
ptrdiff_t*
Н/Д
i Соответствует целому числу.

Формат числа такой же, как ожидается функцией wcstol со значением ​0​ для аргумента base (основание определяется первыми проанализированными символами)

u Соответствует беззнаковому десятичному целому числу.

Формат числа такой же, как ожидается функцией wcstoul со значением 10 для аргумента base

o Соответствует беззнаковому восьмеричному целому числу.

Формат числа такой же, как ожидается функцией wcstoul со значением 8 для аргумента base

x, X Соответствует беззнаковому шестнадцатеричному целому числу.

Формат числа такой же, как ожидается функцией wcstoul со значением 16 для аргумента base

n Возвращает количество прочитанных символов.

Входные данные не потребляются. Не увеличивает счет присваивания. Если для спецификатора определен оператор подавления присваивания, поведение не определено

a, A(C99)
e, E
f, F(C99)
g, G
Соответствует числу с плавающей точкой.

Формат числа такой же, как ожидается функцией wcstof

Н/Д Н/Д
float*
double*
Н/Д Н/Д Н/Д Н/Д
long double*
p Соответствует определённой реализацией последовательности символов, определяющей указатель.

Семейство функций printf должно создавать ту же последовательность, используя спецификатор формата %p

Н/Д Н/Д
void**
Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д

Для каждого спецификатора преобразования, отличного от n, самая длинная последовательность входных символов, которая не превышает указанной ширины поля и которая либо точно соответствует тому, что ожидает спецификатор преобразования, либо является префиксом последовательности, которую он ожидает, потребляется из потока. Первый символ, если таковой имеется, после этой потребленной последовательности остаётся непрочитанным. Если длина потреблённой последовательности равна нулю или если потреблённая последовательность не может быть преобразована, как указано выше, происходит ошибка сопоставления, если не произошла ошибка конца файла, кодировки или чтения из потока, в этом случае это ошибка ввода.

Все спецификаторы преобразования, кроме [, c, и n, потребляют и игнорируют все ведущие символы пробелов (определяются так, как если бы была вызвана функция iswspace) перед попыткой проанализировать входные данные. Потребленные символы не учитываются в указанной максимальной ширине поля.

Если спецификатор длины l не используется, спецификаторы преобразования c, s, и [ выполняют преобразование символов широты в многобайтовые символы так, как если бы была вызвана функция wcrtomb с объектом mbstate_t, инициализированным нулём перед преобразованием первого символа.

Спецификаторы преобразования s и [ всегда сохраняют нулевой терминатор в дополнение к сопоставленным символам. Размер целевого массива должен быть по крайней мере на один больше, чем указанная ширина поля. Использование %s или %[, без указания размера целевого массива, так же небезопасно, как gets.

Правильные спецификации преобразования для целых типов фиксированной ширины (int8_t, и т.д.) определены в заголовке <inttypes.h> (хотя SCNdMAX, SCNuMAX, и т.д. является синонимом %jd, %ju, и т.д.).

После действия каждого спецификатора преобразования имеется точка последовательности "100er"; это позволяет хранить несколько полей в одной переменной «приёмника».

При разборе неполного значения с плавающей точкой, заканчивающегося экспонентой без цифр, например, разборе "100er" со спецификатором преобразования %f, последовательность "100e" (самый длинный префикс возможно действительного числа с плавающей точкой) потребляется, что приводит к ошибке сопоставления (потребленная последовательность не может быть преобразована в число с плавающей точкой), при этом "r" остаётся. Некоторые существующие реализации не следуют этому правилу и отменяют потребление только "100", оставляя "er", например, glibc bug 1765.

Возвращаемое значение

1-3) Количество успешно присвоенных аргументов или EOF в случае ошибки чтения до присвоения первого аргумента.
4-6) То же, что (1-3), за исключением того, что EOF также возвращается, если произошла ошибка выполнения ограничения.

Пример

#include <stdio.h>
#include <wchar.h>
#include <string.h>
 
#define NUM_VARS   3
#define ERR_READ   2
#define ERR_WRITE  3
 
int main(void) {
    wchar_t state[64];
    wchar_t capital[64];
    unsigned int population = 0;
    int elevation = 0;
    int age = 0;
    float pi = 0;
 
#if INTERACTIVE_MODE
    wprintf(L"Enter state, age, and pi value: ");
    if (wscanf(L"%ls%d%f", state, &age, &pi) != NUM_VARS) {
        fprintf(stderr, "Error reading input.\n");
        return ERR_READ;
    }
#else
    wchar_t* input = L"California 170 3.141592";
    if (swscanf(input, L"%ls%d%f", state, &age, &pi) != NUM_VARS) {
        fprintf(stderr, "Error reading input.\n");
        return ERR_READ;
    }
#endif
    wprintf(L"State: %ls\nAge  : %d years\nPi   : %.5f\n\n", state, age, pi);
 
    FILE* fp = tmpfile();
    if (fp) {
        // write some data to temp file
        if (!fwprintf(fp, L"Mississippi Jackson 420000 807")) {
            fprintf(stderr, "Error writing to file.\n");
            fclose(fp);
            return ERR_WRITE;
        }
        // rewind file pointer
        rewind(fp);
 
        // read data into variables
        fwscanf(fp, L"%ls%ls%u%d", state, capital, &population, &elevation);
        wprintf(L"State  : %ls\nCapital: %ls\nJackson population (in 2020): %u\n"
                L"Highest elevation: %dft\n",
                state, capital, population, elevation);
        fclose(fp);
    }
}

Возможный вывод:

State: California
Age  : 170 years
Pi   : 3.14159
 
State  : Mississippi
Capital: Jackson
Jackson population (in 2020): 420000
Highest elevation: 807ft

Справочная информация

  • Стандарт C11 (ISO/IEC 9899:2011):
    • 7.29.2.2 Функция fwscanf (с. 410-416)
    • 7.29.2.4 Функция swscanf (с. 417)
    • 7.29.2.12 Функция wscanf (с. 421)
    • K.3.9.1.2 Функция fwscanf_s (с. 628-629)
    • K.3.9.1.5 Функция swscanf_s (с. 631)
    • K.3.9.1.14 Функция wscanf_s (с. 638)
  • Стандарт C99 (ISO/IEC 9899:1999):
    • 7.24.2.2 Функция fwscanf (с. 356-362)
    • 7.24.2.4 Функция swscanf (с. 362)
    • 7.24.2.12 Функция wscanf (с. 366-367)

См. также

vwscanfvfwscanfvswscanfvwscanf_svfwscanf_svswscanf_s
(C99)(C99)(C99)(C11)(C11)(C11)
считывает форматированный ввод широких символов из stdin, потока файла или буфера с использованием переменного списка аргументов
(функция)
Документация C++ для wscanf, fwscanf, swscanf

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/io/fwscanf

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API