C library function — fscanf()

Ввод в консоли. Функция scanf

Последнее обновление: 20.05.2017

Для ввода данных в консоли может использоваться функция scanf(). Эта функция определена в заголовочном файле stdio.h
(там же, где и функция printf) и имеет следующее формальное определение:

scanf(форматная_строка, аргументы)

И форматная_строка, и аргументы для функции scanf обязательны.

Форматная_строка содержит спецификации преобразования, которые определяют вводимые данные. Общий вид спецификаций преобразования:

% * ширина_поля модификатор спецификатор

Из этих элементов обязательны только два: знак процента % и спецификатор.

Спецификатор определяет тип вводимых данных:

  • %c: считывает один символ

  • %d: считывает десятичное целое число

  • %i: считывает целое число в любой системе (десятичной, шестнадцатеричной, восьмеричной)

  • %u: считывает положительное целое число

  • %e: считывает число с плавающей точкой в экспоненциальной форме

  • %E: считывает число с плавающей точкой в экспоненциальной форме с заглавным символом экспоненты

  • %f: считывает число с плавающей точкой

  • %F: считывает число с плавающей точкой

  • %g: считывает число с плавающей точкой

  • %G: считывает число с плавающей точкой

  • %o: считывает восьмеричное число

  • %x: считывает шестнадцатеричное число

  • %X: считывает шестнадцатеричное число

  • %s: считывает строку

  • %%: считывает символ процента

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

Ширина_поля представляет целое положительное число, которое позволяет определить, какое количество байтов будет учитываться при вводе.

Модификаторы позволяют конкретизировать тип данных. В частности, есть следующие модификаторы:

  • h: для ввода значений типа short int ()

  • l: для ввода значений типа long int () или double (, )

  • L: для ввода значений типа long double (, )

В качестве аргументов в функцию scanf() передаются адреса переменной, которая будет получать введенное значение.
Для получения адреса переменной перед ее именем ставится знак амперсанда &. Например, если переменная называется ,
то ее адрес мы можем получить с помощью выражения .

Например, введем с консоли числовое значение:

#include <stdio.h>

int main(void)
{
	int age;
	printf("Input your age:");
	scanf("%d", &age);
	
	printf("age = %d", age);
	return 0;
}

Здесь вводится значение для переменной age, которая представляет тип int, поэтому в форматную строку в функции scanf
передается спецификатор %d. Здесь не используется ни символ звездочки, ни ширина поля, ни модификаторы. Вторым параметром идет
адрес переменной age — .

После ввода значения мы можем его использовать, например, вывести на консоль:

Input your age:44
age = 44

Аналогичен будет ввод данных других типов:

#include <stdio.h>

int main(void)
{
	int age;
	char name;
	// вводим возраст
	printf("Your age: ");
	scanf("%d", &age);
	// вводим имя
	printf("Your name: ");
	scanf("%10s", &name);
	
	printf("Name: %s \t Age = %d",name,  age);
	return 0;
}

Здесь для имени выделяется 10 символов. Теоретически мы можем ввести и большее количество символов, но чтобы только 10 из них учитывались,
в строку форматирования передается ширина поля, которая представляет 10 символов — . Возможный консольный вывод:

Your age: 24
Your name: Tom
Name: Tom 	 Age = 24

Можно сразу вводить несколько значений. В этом случае в качестве разделителя используется пробел:

#include <stdio.h>

int main(void)
{
	int age;
	char name;
	float weight;
	scanf("%d %s %f", &age, &name, &weight);
	
	printf("Name: %s \t Age = %d \t Weight = %f",name,  age, weight);
	return 0;
}

Консольный ввод-вывод:

23 Tom 55.34
Name: Tom	Age = 23	Weight = 55.340000

НазадВперед

Return Value

Returns the number of fields successfully converted and assigned. The return value doesn’t include fields that were read but not assigned. A return value of 0 indicates no fields were assigned. The return value is EOF for an error, or if the end-of-file character or the end-of-string character is found in the first attempt to read a character. If format is a NULL pointer, the invalid parameter handler is invoked, as described in Parameter Validation. If execution is allowed to continue, scanf_s and wscanf_s return EOF and set errno to EINVAL.

For information about these and other error codes, see errno, _doserrno, _sys_errlist, and _sys_nerr.

Условный оператор if

Условный оператор if может использоваться в форме полной или неполной развилки.

Неполная развилка Полная развилка

1234

if (Условие){  БлокОпераций1;}

12345678

if (Условие){  БлокОпераций1;}else{  БлокОпераций2;}

В случае неполной развилки если Условие истинно, то БлокОпераций1 выполняется, если Условие ложно, то БлокОпераций1 не выполняется.
В случае полной развилки если Условие истинно, то выполняется БлокОпераций1, иначе выполняется БлокОпераций2.БлокОпераций может состоять из одной операции. В этом случае наличие фигурных скобок, ограничивающих блок, необязательно.
Основными операциями, проверяемыми внутри условного блока, являются операции отношения.Пример на C:

1234567891011121314

#define _CRT_SECURE_NO_WARNINGS // для возможности использования scanf#include <stdio.h>int main(){  int k;           // объявляем целую переменную k  printf(«k= «);   // выводим сообщение  scanf(«%d», &k); // вводим переменную k  if (k >= 5)      // если k>5    printf(«%d >= 5», k); // выводим «ЗНАЧЕНИЕ >= 5»  else             // иначе    printf(«%d < 5», k);  // выводим «ЗНАЧЕНИЕ < 5»  getchar(); getchar();  return 0;}

ifПример на C

123456789101112131415161718

#define _CRT_SECURE_NO_WARNINGS // для возможности использования scanf#include <stdio.h>#include <stdlib.h> // для использования функции systemint main() {  int key;  // объявляем целую переменную key  system(«chcp 1251»); // переходим в консоли на русский язык  system(«cls»);       // очищаем окно консоли  printf(«Введите номер пункта, 1 или 2: «);  scanf(«%d», &key);   // вводим значение переменной key  if (key == 1)        // если key = 1    printf(«\n Выбран первый пункт»); // выводим сообщение  else if (key == 2)   // иначе если key = 2    printf(«\n Выбран второй пункт»); // выводим сообщение  else                 // иначе    printf(«\n Первый и второй пункты не выбраны»); // выводим сообщение  getchar(); getchar();  return 0;}

Результат выполнения

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

123456789101112131415161718

#define _CRT_SECURE_NO_WARNINGS // для возможности использования scanf#include <stdio.h>#include <stdlib.h> // для использования функции systemint main() {  int key;  // объявляем целую переменную key  system(«chcp 1251»); // переходим в консоли на русский язык  system(«cls»);       // очищаем окно консоли  printf(«Введите номер пункта, 1 или 2: «);  scanf(«%d», &key);   // вводим значение переменной key  if (key != 1) {      // если key не равен 1    if (key == 2)    // если key равен 2      printf(«\n Выбран второй пункт»); // вывод сообщения  }              // если key — не 1 и не 2, то ничего не выводится  else // иначе, если key равен 1    printf(«\n Выбран первый пункт»); // вывод сообщения  getchar(); getchar();  return 0;}

Модификаторы форматат

Как и printf(), функция scanf() дает возможность модифицировать некоторое число своих спецификаторов формата. В спецификаторах формата моно указать модификатор максимальной длины поля. Это целое число, расположенное между % и спецификатором формата; оно ограничивает число символов, считываемых из этого поля. Например, чтобы считывать в переменную str не более 20 символов, пишите

scanf("%20s", str);

Если поток ввода содержит больше 20 символов, то при следующем вызове функций ввода считывание начнется после того места, где оно закончилось при предыдущем вызове. Например, если вы в ответ на вызов scanf() из этого примера введете

ABCDEFGHIJKLMNOPRSTUVWXYZ

то в str из-за спецификатора максимальной ширины поля будет помещено только 20 символов, то есть символы вплоть до Т. Это значит, что оставшиеся символы UVWXYZ пока еще не прочитаны. При следующем вызове scanf(), например при выполнении оператора

scanf("%s", str);

в str будут помешены буквы UVWXYZ. Ввод из поля может завершиться и до того, как будет достигнута максимальная длина поля — если встретится разделитель. В таком случае scanf() переходит к следующему полю.

Чтобы прочитать длинное целое, перед спецификатором формата поместите l (эль). А для чтения короткого целого значения перед спецификатором формата следует поместить n. Эти модификаторы можно использовать со следующими кодами форматов: d, i, o, u, x и n.

По умолчанию спецификаторы f, e и g дают scanf() указание присваивать данные переменной типа float. Если перед одним из этих спецификаторов будет помещен l (эль), то scanf() будет присваивать данные переменной типа double. Использование L дает scanf() указание, чтобы переменная, принимающая данные, имела тип long double.

Если в компиляторе предусмотрена обработка двухбайтовых символов, добавленных в язык С Поправкой 1 от 1995 года, то модификатор l можно также использовать с такими кодами формата, как c и s. l непосредственно перед c является признаком указателя на объект типа wchar_t. А l непосредственно перед s — признак указателя на массив элементов типа wchar_t. Кроме того, l также применяется для модификации набора сканируемых символов, чтобы этот набор можно было использовать для двухбайтовых символов.

В Стандарте С99, кроме перечисленных, предусмотрены также модификаторы ll и hh, последний из которых можно применять к спецификаторам d, i, o, u, x или n. Он является признаком того, что соответствующий аргумент является указателем на значение, типа signed или unsigned char. Кроме того, к спецификаторам d, i, o, u, x и n можно применять и ll, этот спецификатор является признаком того, что соответствующий аргумент является указателем на значение типа signed (или unsigned) long long int.

На заметку В С99 для функции scanf() имеются еще и другие модификаторы типа; о них рассказывается в части II.

Example

The following example shows the usage of fscanf() function.

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


int main () {
   char str1, str2, str3;
   int year;
   FILE * fp;

   fp = fopen ("file.txt", "w+");
   fputs("We are in 2012", fp);
   
   rewind(fp);
   fscanf(fp, "%s %s %s %d", str1, str2, str3, &year);
   
   printf("Read String1 |%s|\n", str1 );
   printf("Read String2 |%s|\n", str2 );
   printf("Read String3 |%s|\n", str3 );
   printf("Read Integer |%d|\n", year );

   fclose(fp);
   
   return(0);
}

Let us compile and run the above program that will produce the following result −

Read String1 |We|
Read String2 |are|
Read String3 |in|
Read Integer |2012|

stdio_h.htm

Previous Page
Print Page

Next Page  

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

Каждая из этих функций возвращает количество полей, которые были успешно преобразованы и присвоены; возвращаемое значение не включает поля, которые были считаны, но не были присвоены.Each of these functions returns the number of fields successfully converted and assigned; the return value does not include fields that were read but not assigned. Возвращаемое значение 0 указывает, что поля не были назначены.A return value of 0 indicates that no fields were assigned. Возвращаемое значение — EOF для ошибки или, если конец строки достигнут перед первым преобразованием.The return value is EOF for an error or if the end of the string is reached before the first conversion.

Если buffer или Format является пустым указателем, вызывается обработчик недопустимых параметров, как описано в разделе Проверка параметров.If buffer or format is a NULL pointer, the invalid parameter handler is invoked, as described in Parameter Validation. Если выполнение может быть продолжено, эти функции возвращают-1 и устанавливают для еинвалзначение.If execution is allowed to continue, these functions return -1 and set errno to EINVAL.

Дополнительные сведения об этих и других кодах ошибок см. в разделе _doserrno, errno, _sys_errlist и _sys_nerr.For information on these and other error codes, see _doserrno, errno, _sys_errlist, and _sys_nerr.

Remarks

The scanf_s function reads data from the standard input stream, stdin, and writes it into argument. Each argument must be a pointer to a variable type that corresponds to the type specifier in format. If copying occurs between strings that overlap, the behavior is undefined.

wscanf_s is a wide-character version of scanf_s; the format argument to wscanf_s is a wide-character string. wscanf_s and scanf_s behave identically if the stream is opened in ANSI mode. scanf_s doesn’t currently support input from a UNICODE stream.

The versions of these functions that have the _l suffix are identical, except they use the locale parameter instead of the current thread locale.

Unlike scanf and wscanf, scanf_s and wscanf_s require you to specify buffer sizes for some parameters. Specify the sizes for all c, C, s, S, or string control set [] parameters. The buffer size in characters is passed as an additional parameter. It immediately follows the pointer to the buffer or variable. For example, if you’re reading a string, the buffer size for that string is passed as follows:

The buffer size includes the terminal null. You can use a width specification field to ensure the token that’s read in fits into the buffer. When a token is too large to fit, nothing is written to the buffer unless there’s a width specification.

Note

The size parameter is of type , not size_t. Use a static cast to convert a size_t value to for 64-bit build configurations.

The buffer size parameter describes the maximum number of characters, not bytes. In this example, the width of the buffer type doesn’t match the width of the format specifier.

The S format specifier means use the character width that’s «opposite» the default width supported by the function. The character width is single byte, but the function supports double-byte characters. This example reads in a string of up to nine single-byte-wide characters and puts them in a double-byte-wide character buffer. The characters are treated as single-byte values; the first two characters are stored in , the second two are stored in , and so on.

This example reads a single character:

When multiple characters for non-null-terminated strings are read, integers are used for both the width specification and the buffer size.

For more information, see scanf Width Specification.

Generic-Text Routine Mappings

TCHAR.H routine _UNICODE & _MBCS not defined _MBCS defined _UNICODE defined
_tscanf_s scanf_s scanf_s wscanf_s
_tscanf_s_l _scanf_s_l _scanf_s_l _wscanf_s_l

For more information, see Format Specification Fields: scanf and wscanf Functions.

Parameters

  • str − This is the C string that the function processes as its source to retrieve the data.

  • format − This is the C string that contains one or more of the following items: Whitespace character, Non-whitespace character and Format specifiers

    A format specifier follows this prototype: type=]

Sr.No. Argument & Description
1

*

This is an optional starting asterisk, which indicates that the data is to be read from the stream but ignored, i.e. it is not stored in the corresponding argument.

2

width

This specifies the maximum number of characters to be read in the current reading operation.

3

modifiers

Specifies a size different from int (in the case of d, i and n), unsigned int (in the case of o, u and x) or float (in the case of e, f and g) for the data pointed by the corresponding additional argument: h : short int (for d, i and n), or unsigned short int (for o, u and x) l : long int (for d, i and n), or unsigned long int (for o, u and x), or double (for e, f and g) L : long double (for e, f and g)

4

type

A character specifying the type of data to be read and how it is expected to be read. See next table.

fscanf type specifiers

type Qualifying Input Type of argument
c Single character: Reads the next character. If a width different from 1 is specified, the function reads width characters and stores them in the successive locations of the array passed as argument. No null character is appended at the end. char *
d Decimal integer: Number optionally preceded with a + or — sign int *
e, E, f, g, G Floating point: Decimal number containing a decimal point, optionally preceded by a + or — sign and optionally followed by the e or E character and a decimal number. Two examples of valid entries are -732.103 and 7.12e4 float *
o Octal Integer: int *
s String of characters. This will read subsequent characters until a whitespace is found (whitespace characters are considered to be blank, newline and tab). char *
u Unsigned decimal integer. unsigned int *
x, X Hexadecimal Integer int *

other arguments − This function expects a sequence of pointers as additional arguments, each one pointing to an object of the type specified by their corresponding %-tag within the format string, in the same order.
For each format specifier in the format string that retrieves data, an additional argument should be specified. If you want to store the result of a sscanf operation on a regular variable you should precede its identifier with the reference operator, i.e. an ampersand sign (&), like: int n; sscanf (str,»%d»,&n);

Return Value

Each of these functions returns the number of fields that are successfully converted and assigned; the return value does not include fields that were read but not assigned. A return value of 0 indicates that no fields were assigned. If an error occurs, or if the end of the file stream is reached before the first conversion, the return value is EOF for fscanf_s and fwscanf_s.

These functions validate their parameters. If stream is an invalid file pointer, or format is a null pointer, these functions invoke the invalid parameter handler, as described in Parameter Validation. If execution is allowed to continue, these functions return EOF and set errno to EINVAL.

Remarks

The fscanf_s function reads data from the current position of stream into the locations that are given by argument (if any). Each argument must be a pointer to a variable of a type that corresponds to a type specifier in format. format controls the interpretation of the input fields and has the same form and function as the format argument for scanf_s; see Format Specification Fields: scanf and wscanf Functions for a description of format. fwscanf_s is a wide-character version of fscanf_s; the format argument to fwscanf_s is a wide-character string. These functions behave identically if the stream is opened in ANSI mode. fscanf_s doesn’t currently support input from a UNICODE stream.

The main difference between the more secure functions (that have the _s suffix) and the other versions is that the more secure functions require the size in characters of each c, C, s, S, and type field to be passed as an argument immediately following the variable. For more information, see scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l and scanf Width Specification.

Note

The size parameter is of type , not size_t.

The versions of these functions that have the _l suffix are identical except that they use the locale parameter that’s passed in instead of the current thread locale.

Generic-Text Routine Mappings

TCHAR.H routine _UNICODE & _MBCS not defined _MBCS defined _UNICODE defined
_ftscanf_s fscanf_s fscanf_s fwscanf_s
_ftscanf_s_l _fscanf_s_l _fscanf_s_l _fwscanf_s_l

Некоторые особенности и ограничения функции scanf()

Как только поступают некорректные данные, функция  завершает свою работу. В примере:

если переменной a попытаться присвоить символ или строку, что невозможно, то переменная bуже обрабатываться не будет. Можно предположить, что так будет надежнее:

  scanf("%d", &a);
  scanf("%f", &b);

Вроде бы неудачное считывание a не должно оказывать никакого влияния на b, т.к. это уже иной вызов . Но не все так просто: при некорректном вводе данные остаются в буфере и пытаются «навязать» себя последующим вызовам . Поэтому при использовании надо думать о том, как в случае некорректного ввода очистить буфер. Например, это можно сделать так, как показано ниже, или путем использования специальных функций (здесь не рассматриваются):

  if (scanf("%d", &a) != 1) // если данные не удалось присвоить переменной,
    scanf("%*s"); // то выбросить их в виде строки.
  scanf("%f", &b);

Разделителем данных для  являются символы пустого пространства. Это означает отсутствие возможности записать строку, содержащую неизвестное количество пробелов, в одну переменную, используя только . Придется использовать либо другую функцию (например, ), либо создать циклическую конструкцию, считывающую по одному слову и добавляющую его к общей строке.

Таким образом, не смотря на достаточно большие возможности , эта функция хранит в себе ряд неудобств и опасностей.

Решение задач

  1. На прошлом занятии вы написали программу, содержащую функции, вычисляющие факториал числа и заданный элемент ряда Фибоначчи. Измените эту программу таким образом, чтобы она запрашивала у пользователя, что он хочет вычислить: факториал или число Фибоначчи. Затем программа запрашивала бы у пользователя либо число для вычисления факториала, либо номер элемента ряда Фибоначчи.
  2. Напишите программу, которая запрашивает у пользователя две даты в формате дд.мм.гггг. Дни, месяцы и года следует присвоить целочисленным переменным. Программа должна выводить на экран информацию о том, какая дата более ранняя, а какая более поздняя.
  3. Используя цикл, напишите код, в котором пользователю предлагается вводить данные до тех пор, пока он не сделает это корректно, т.е. пока все указанные в  переменные не получат свои значения. Протестируйте программу. 

Return Value

Returns the number of fields successfully converted and assigned. The return value doesn’t include fields that were read but not assigned. A return value of 0 indicates no fields were assigned. The return value is EOF for an error, or if the end-of-file character or the end-of-string character is found in the first attempt to read a character. If format is a NULL pointer, the invalid parameter handler is invoked, as described in Parameter Validation. If execution is allowed to continue, scanf_s and wscanf_s return EOF and set errno to EINVAL.

For information about these and other error codes, see errno, _doserrno, _sys_errlist, and _sys_nerr.

Непечатные символы

В си определён ряд символов, которые не выводятся на печать, но позволяют производить форматирование вывода. Эти символы
можно задавать в виде численных значений, либо в виде эскейп-последовательностей: символа, экранированного обратным слешем.

#include <stdio.h>
#include <conio.h>

void main() {
	char backspace = 0x08;
	//Выводим с использованием символа переноса строки
	printf("Hello\nWorld\n");
	//Выводим символ переноса строки через его значение
	printf("Hello%cWorld\n", 0x0a);
	//"Выводим" сигнал
	printf("\a");
	//Выводим сигнал, как символ
	printf("%c", '\a');
	//Выводим сигнал через шестнадцатеричное значение
	printf("%c", 0x07);
	printf("This is sparta!!!\b\b%c", backspace);
	printf("   ");
	getch();
}

Q&A

Всё ещё не понятно? – пиши вопросы на ящик

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

Каждая из этих функций возвращает количество полей, которые были успешно преобразованы и присвоены; возвращаемое значение не включает поля, которые были считаны, но не были присвоены.Each of these functions returns the number of fields that are successfully converted and assigned; the return value does not include fields that were read but not assigned. Возвращаемое значение 0 указывает, что поля не были назначены.A return value of 0 indicates that no fields were assigned. При возникновении ошибки или при достижении конца файлового потока до первого преобразования возвращается значение EOF для fscanf_s и fwscanf_s.If an error occurs, or if the end of the file stream is reached before the first conversion, the return value is EOF for fscanf_s and fwscanf_s.

Эти функции проверяют свои параметры.These functions validate their parameters. Если Stream является недопустимым указателем на файл или Format является пустым указателем, эти функции вызывают обработчик недопустимого параметра, как описано в разделе Проверка параметров.If stream is an invalid file pointer, or format is a null pointer, these functions invoke the invalid parameter handler, as described in Parameter Validation. Если выполнение может быть продолжено, эти функции возвращают EOF и применяют значение еинвал.If execution is allowed to continue, these functions return EOF and set errno to EINVAL.

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

Возвращает число успешно преобразованных и назначенных полей.Returns the number of fields successfully converted and assigned. Возвращаемое значение не включает поля, которые были считаны, но не были назначены.The return value doesn’t include fields that were read but not assigned. Возвращаемое значение 0 указывает, что поля не были назначены.A return value of 0 indicates no fields were assigned. Возвращаемое значение — EOF для ошибки или, если символ конца файла или символ конца строки находится в первой попытке чтения символа.The return value is EOF for an error, or if the end-of-file character or the end-of-string character is found in the first attempt to read a character. Если параметр Format является пустым указателем, вызывается обработчик недопустимых параметров, как описано в разделе Проверка параметров.If format is a NULL pointer, the invalid parameter handler is invoked, as described in Parameter Validation. Если выполнение может быть продолжено, scanf_s и Wscanf_s возвращают EOF и присвойте параметру еинвалзначение » No @ @».</span><span class=»sxs-lookup»>If execution is allowed to continue, scanf_s and wscanf_s return EOF and set errno to EINVAL.

Дополнительные сведения об этих и других кодах ошибок см. в разделе errno, _doserrno, _sys_errlist и _sys_nerr.For information about these and other error codes, see errno, _doserrno, _sys_errlist, and _sys_nerr.

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

Возвращает количество успешно преобразованных и назначенных полей. Возвращаемое значение не включает поля, которые были прочитаны, но не были назначены.Returns the number of fields successfully converted and assigned; the return value does not include fields that were read but not assigned. Возвращаемое значение 0 указывает, что поля не были назначены.A return value of 0 indicates that no fields were assigned.

Если параметр Format является пустым указателем, вызывается обработчик недопустимых параметров, как описано в разделе Проверка параметров.If format is a NULL pointer, the invalid parameter handler is invoked, as described in Parameter Validation. Если выполнение может быть продолжено, эти функции возвращают EOF и применяют значение еинвал.If execution is allowed to continue, these functions return EOF and set errno to EINVAL.

Дополнительные сведения об этих и других кодах ошибок см. в разделе _doserrno, errno, _sys_errlist и _sys_nerr.For information on these and other error codes, see _doserrno, errno, _sys_errlist, and _sys_nerr.

RemarksRemarks

Функция scanf считывает данные из стандартного входного потока stdin и записывает данные в расположение, заданное аргументом.The scanf function reads data from the standard input stream stdin and writes the data into the location given by argument. Каждый аргумент должен быть указателем на переменную типа, которая соответствует спецификатору типа в формате.Each argument must be a pointer to a variable of a type that corresponds to a type specifier in format. Если копирование производится между перекрывающимися строками, поведение не определено.If copying takes place between strings that overlap, the behavior is undefined.

Важно!

При чтении строки с помощью scanfвсегда указывайте ширину для формата % s (например, «%32» вместо «% s»); в противном случае входные данные неправильного формата могут легко вызвать переполнение буфера.When reading a string with scanf, always specify a width for the %s format (for example, «%32s» instead of «%s»); otherwise, improperly formatted input can easily cause a buffer overrun. Кроме того, рекомендуется использовать scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l или fgets.Alternately, consider using scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l or fgets.

wscanf — это версия scanfдля расширенных символов; Аргумент формата для wscanf является строкой расширенных символов.wscanf is a wide-character version of scanf; the format argument to wscanf is a wide-character string. поведение wscanf и scanf идентично, если поток открыт в режиме ANSI.wscanf and scanf behave identically if the stream is opened in ANSI mode. scanf в настоящее время не поддерживает входные данные из потока Юникода.scanf doesn’t currently support input from a UNICODE stream.

Версии этих функций с суффиксом _l идентичны за исключением того, что они используют переданный параметр языкового стандарта вместо локали текущего потока.The versions of these functions with the _l suffix are identical except that they use the locale parameter passed in instead of the current thread locale.

Универсальное текстовое сопоставление функцийGeneric-Text Routine Mappings

Подпрограмма TCHAR.HTCHAR.H routine _UNICODE и _MBCS не определены_UNICODE & _MBCS not defined _MBCS определено_MBCS defined _UNICODE определено_UNICODE defined
_tscanf_tscanf scanfscanf scanfscanf wscanfwscanf
_tscanf_l_tscanf_l _scanf_l_scanf_l _scanf_l_scanf_l _wscanf_l_wscanf_l

Дополнительные сведения см. в разделе поля спецификации формата — функции scanf и функции wscanf.For more information, see Format Specification Fields — scanf functions and wscanf Functions.

ТребованияRequirements

ПодпрограммаRoutine Обязательный заголовокRequired header
scanf, _scanf_lscanf, _scanf_l <stdio.h>
wscanf, _wscanf_lwscanf, _wscanf_l <stdio.h> или <wchar.h><stdio.h> or <wchar.h>

Консоль не поддерживается в приложениях универсальная платформа Windows (UWP).The console is not supported in Universal Windows Platform (UWP) apps. Стандартные дескрипторы потока, связанные с консолью, stdin, stdoutи stderr, должны быть перенаправляться до того, как функции времени выполнения C смогут использовать их в приложениях UWP.The standard stream handles that are associated with the console, stdin, stdout, and stderr, must be redirected before C run-time functions can use them in UWP apps. Дополнительные сведения о совместимости см. в статье Compatibility.For additional compatibility information, see Compatibility.

Вывод чисел

Числа в десятичном формате со знаком отображаются с помощью спецификатора преобразования %d или %i. Эти спецификаторы преобразования эквивалентны; оба поддерживаются в силу сложившихся привычек программистов, например, из-за желания поддерживать те же спецификаторы, которые применяются в функции scanf().

Для вывода целого значения без знака используйте %u.

Спецификатор преобразования %f дает возможность выводить числа в формате с плавающей точкой. Соответствующий аргумент должен иметь тип double.

Спецификаторы преобразования %e и %E в функции printf() позволяют отображать аргумент типа double в экспоненциальном формате. В общем виде числа в таком формате выглядят следующим образом:

x.dddddE+/-yy

Чтобы отобразить букву E в верхнем регистре, используйте спецификатор преобразования %E; в противном случае используйте спецификатор преобразования %e.

Спецификатор преобразования %g или %G указывает, что функции printf() необходимо выбрать один из спецификаторов: %f или %e. В результате printf() выберет тот спецификатор преобразования, который позволяет сделать самый короткий вывод. Если нужно, чтобы при выборе экспоненциального формата буква E отображалась на верхнем регистре, используйте спецификатор преобразования %G; в противном случае используйте спецификатор преобразования %g.

Применение спецификатора преобразования %g показано в следующей программе:

#include <stdio.h>

int main(void)
{
  double f;

  for(f=1.0; f<1.0e+10; f=f*10)
    printf("%g ", f);

  return 0;
}

В результате выполнения получится следующее:

1  10  100  1000  10000  100000  1e+06  1e+07  1e+08  1e+09

Целые числа без знака можно выводить в восьмеричном или шестнадцатеричном формате, используя спецификатор преобразования %o или %x. Так как в шестнадцатеричной системе для представления чисел от 10 до 15 используются буквы от А до F, то эти буквы можно выводить на верхнем или на нижнем регистре. Как показано ниже, в первом случае используется спецификатор преобразования %X, а во втором — спецификатор преобразования %x:

#include <stdio.h>

int main(void)
{
  unsigned num;

  for(num=0; num < 16; num++) {
    printf("%o ", num);
    printf("%x ", num);
    printf("%X\n", num);
  }

  return 0;
}

Вот что вывела эта программа:

0 0 0
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
10 8 8
11 9 9
12 a A
13 b B
14 c C
15 d D
16 e E
17 f F
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *