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
и сохраняет результаты в указанные места.
stream
.
buffer
. Достижение конца строки эквивалентно достижению условия конца файла для
fwscanf
-
- любой из аргументов типа указателя является нулевым указателем
-
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
состоит из
- непробельные широкие символы, кроме % : каждый такой символ в строке формата потребляет ровно один идентичный символ из входного потока, или вызывает сбой функции, если следующий символ в потоке не совпадает.
- пробельные символы: любой одиночный пробельный символ в строке формата потребляет все доступные последовательные пробельные символы из входных данных (определяется как при многократном вызове iswspace ). Заметьте, что нет разницы между " \n " , " " , " \t \t " , или другими пробельными символами в строке формата.
- спецификации преобразования. Каждая спецификация преобразования имеет следующий формат:
-
- вводный % символ.
-
- (необязательный) символ подавления присваивания * . При наличии этой опции функция не присваивает результат преобразования какому-либо принимающему аргументу.
-
- (необязательно) целое число (больше нуля), которое определяет максимальную ширину поля , то есть максимальное количество символов, которое функция может обработать при выполнении преобразования, указанного текущей спецификацией преобразования. Обратите внимание, что % s и % [ могут привести к переполнению буфера, если ширина не указана.
-
- (необязательный) модификатор длины , который указывает размер принимающего аргумента, то есть фактический тип назначения. Это влияет на точность преобразования и правила переполнения. Тип назначения по умолчанию различается для каждого типа преобразования (см. таблицу ниже).
-
- спецификатор формата преобразования.
Доступны следующие спецификаторы формата:
|
Спецификатор
преобразования |
Объяснение |
Ожидаемый
тип аргумента |
||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Модификатор длины→ |
hh
|
h
|
отсутствует |
l
|
ll
|
j
|
z
|
t
|
L
|
|
| Доступно только с C99→ | Да | Да | Да | Да | Да | |||||
%
|
Соответствует литералу
%
.
|
N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A |
c
|
Соответствует символу или последовательности символов .
|
N/A | N/A |
char
*
|
wchar_t
*
|
N/A | N/A | N/A | N/A | N/A |
s
|
Соответствует последовательности непробельных символов ( строка ).
|
|||||||||
[
set
]
|
Сопоставляет непустую последовательность символов из set набора символов.
|
|||||||||
d
|
Соответствует десятичному целому числу .
|
signed
char
*
или
unsigned
char
*
|
signed
short
*
или
unsigned
short
*
|
signed
int
*
или
unsigned
int
*
|
signed
long
*
или
unsigned
long
*
|
signed
long
long
*
или
unsigned
long
long
*
|
size_t
*
|
Н/Д | ||
i
|
Соответствует целому числу .
|
|||||||||
u
|
Соответствует беззнаковому десятичному целому числу .
|
|||||||||
o
|
Соответствует беззнаковому восьмеричному целому числу .
|
|||||||||
x
X
|
Соответствует беззнаковому шестнадцатеричному целому числу .
|
|||||||||
n
|
Возвращает количество символов, прочитанных на данный момент .
|
|||||||||
a
(C99)
A
(C99)
e
E
f
F
(C99)
g
G
|
Соответствует числу с плавающей запятой .
|
N/A | N/A |
float
*
|
double
*
|
N/A | N/A | N/A | N/A |
long
double
*
|
p
|
Сопоставляется с определяемой реализацией последовательностью символов, определяющей указатель .
|
N/A | N/A |
void
**
|
N/A | N/A | N/A | N/A | N/A | N/A |
| Примечания | ||||||||||
|
Для каждого спецификатора преобразования, кроме n , из потока считывается самая длинная последовательность входных символов, не превышающая заданную ширину поля, которая либо точно соответствует ожиданиям спецификатора преобразования, либо является префиксом последовательности, которую он ожидает. Первый символ после этой считанной последовательности, если таковой имеется, остается непрочитанным. Если длина считанной последовательности равна нулю или если считанная последовательность не может быть преобразована как указано выше, происходит ошибка сопоставления, если только конец файла, ошибка кодирования или ошибка чтения не предотвратили ввод из потока, в этом случае это ошибка ввода. Все спецификаторы преобразования, кроме [ , c и n , потребляют и отбрасывают все ведущие пробельные символы (определяемые как при вызове iswspace ) перед попыткой разбора ввода. Эти потребленные символы не учитываются в указанной максимальной ширине поля. Если спецификатор длины l не используется, спецификаторы преобразования c , s и [ выполняют преобразование широких символов в многобайтовые, как если бы вызывалась функция wcrtomb с объектом mbstate_t , инициализированным нулем до преобразования первого символа. Спецификаторы преобразования s и [ всегда сохраняют нулевой терминатор в дополнение к сопоставленным символам. Размер целевого массива должен быть как минимум на единицу больше указанной ширины поля. Использование % s или % [ без указания размера целевого массива так же небезопасно, как gets .
Правильные спецификации преобразования для
целочисленных типов фиксированной ширины
(
int8_t
и т.д.) определены в заголовочном файле
Существует точка следования после действия каждого спецификатора преобразования; это позволяет сохранять несколько полей в одну и ту же переменную-приемник. При разборе неполного значения с плавающей точкой, заканчивающегося экспонентой без цифр, например, разбор "100er" со спецификатором преобразования % f , последовательность "100e" (самый длинный префикс потенциально допустимого числа с плавающей точкой) потребляется, что приводит к ошибке сопоставления (потребленная последовательность не может быть преобразована в число с плавающей точкой), при этом "r" остается. Некоторые существующие реализации не следуют этому правилу и откатываются, потребляя только "100" , оставляя "er" , например, glibc bug 1765 . Если спецификация преобразования недействительна, поведение не определено. |
||||||||||
Возвращаемое значение
Пример
#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"Введите штат, возраст и значение pi: "); if (wscanf(L"%ls%d%f", state, &age, &pi) != NUM_VARS) { fprintf(stderr, "Ошибка чтения ввода.\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, "Ошибка чтения ввода.\n"); return ERR_READ; } #endif wprintf(L"Штат: %ls\nВозраст : %d лет\nPi : %.5f\n\n", state, age, pi); FILE* fp = tmpfile(); if (fp) { // записать данные во временный файл if (!fwprintf(fp, L"Mississippi Jackson 420000 807")) { fprintf(stderr, "Ошибка записи в файл.\n"); fclose(fp); return ERR_WRITE; } // перемотать указатель файла rewind(fp); // прочитать данные в переменные fwscanf(fp, L"%ls%ls%u%d", state, capital, &population, &elevation); wprintf(L"Штат : %ls\nСтолица: %ls\nНаселение Джексона (в 2020): %u\n" L"Наивысшая точка: %d футов\n", state, capital, population, elevation); fclose(fp); } }
Возможный вывод:
Штат: California Возраст : 170 лет Pi : 3.14159 Штат : Mississippi Столица: Jackson Население Джексона (в 2020): 420000 Наивысшая точка: 807 футов
Ссылки
- Стандарт 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)
Смотрите также
|
(C99)
(C99)
(C99)
(C11)
(C11)
(C11)
|
читает форматированный широкосимвольный ввод из
stdin
, файлового потока
или буфера с использованием списка переменных аргументов (функция) |
|
Документация C++
для
wscanf
,
fwscanf
,
swscanf
|
|