Функция Scanf C: описание. Форматированный ввод данных

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

int printf(const char *format [, argument]...);

Здесь первый аргумент *format определяет строку, которая выводится на экран и может содержать специальные управляющие символы для вывода переменных. Затем, следует список необязательных аргументов, которые поясняются ниже. Функуция возвращает либо число отображенных символов, либо отрицательное число в случае своей некорректной работы.

В самой простой реализации функция printf() просто выводит заданную строку на экран монитора:

printf(“Привет мир.”);

Однако с ее помощью можно выводить переменные разного типа: начиная с числовых и заканчивая строковыми. Для выполнения этой операции используются специальные управляющие символы, которые называются спецификаторами и которые начинаются с символа %. Следующий пример демонстрирует вывод целочисленной переменной num на экран монитора с помощью функции printf():

int num;
num = 5;
printf(“%d”, num);

В первых двух строках данной программы задается переменная с именем num типа int. В третьей строке выполняется вывод переменной на экран. Работа функции printf() выглядит следующим образом. Сначала функция анализирует строку, которую необходимо вывести на экран. В данном случае это «%d». Если в этой строке встречается спецификатор, то на его место записывается значение переменной, которая является вторым аргументом функции printf(). В результате, вместо исходной строки «%d» на экране появится строка «5», т.е. будет выведено число 5.

Следует отметить, что спецификатор «%d» выводит только целочисленные типы переменных, например int. Для вывода других типов следует использовать другие спецификаторы. Ниже перечислены основные виды спецификаторов:

%с – одиночный символ
%d – десятичное целое число со знаком
%f – число с плавающей точкой (десятичное представление)
%s – строка символов (для строковых переменных)
%u – десятичное целое без знака
%% - печать знака процента

С помощью функции printf() можно выводить сразу несколько переменных. Для этого используется следующая конструкция:

int num_i;
float num_f;
num_i = 5;
num_f = 10.5;
printf(“num_i = %d, num_f = %f”, num_i, num_f);

Результат выполнения программы будет выглядеть так:

num_i = 5, num_f = 10.5

Кроме спецификаторов в функции printf() используются управляющие символы, такие как перевод строки \n, табуляции \t и др. Например, если в ранее рассмотренном примере необходимо вывести значения переменных не в строчку, а в столбик, то необходимо переписать функцию printf() следующим образом:

printf(“num_i = %d,\n num_f = %f”, num_i, num_f);

Аналогично используется и символ табуляции.

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

int scanf(const char *format [,argument]...);

Здесь, как и для функции printf(), переменная *format определяет форматную строку для определения типа вводимых данных и может содержать те же спецификаторы что и функция printf(). Затем, следует список необязательных аргументов. Работа функции scanf() демонстрируется на листинге 1.4.

Листинг 1.4. Пример использования функции scanf().

#include
int main()
{
int age;
float weight;
printf(“Введите информацию о Вашем возрасте: ”);
scanf(“%d”, &age);
printf(“Введите информацию о Вашем весе: ”);
scanf(“%f”, &weigth);
printf(“Ваш возраст = %d, Ваш вес = %f”, age, weigth);

Return 0;
}

Основным отличием применения функции scanf() от функции printf() является знак & перед именем переменной, в которую записываются результаты ввода.

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

scanf(“ %d, %d ”, &n, &m);

Функция scanf() интерпретирует это так, как будто ожидает, что пользователь введет число, затем – запятую, а затем – второе число. Все происходит так, как будто требуется ввести два целых числа следующим образом:

Функция scanf() возвращает число успешно считанных элементов. Если операции считывания не происходило, что бывает в том случае, когда вместо ожидаемого цифрового значения вводится какая-либо буква, то возвращаемое значение равно 0.

Основной задачей программирования является обработка информации, поэтому любой язык программирования имеет средства для ввода и вывода информации. В языке Си нет операторов ввода-вывода.

Ввод и вывод информации осуществляется через функции стандартной библиотеки. Прототипы рассматриваемых функций находятся в файле stdio.h . Эта библиотека содержит функции

  • printf() — для вывода информации
  • scanf() — для ввода информации.

Вывод информации

Функция printf() предназначена для форматированного вывода. Она переводит данные в символьное представление и выводит полученные изображения символов на экран. При этом у программиста имеется возможность форматировать данные, то есть влиять на их представление
на экране.

Общая форма записи функции printf() :

printf("СтрокаФорматов" , объект1, объект2, ..., объектn);

СтрокаФорматов состоит из следующих элементов:

  • управляющих символов;
  • текста, представленного для непосредственного вывода;
  • форматов, предназначенных для вывода значений переменных различных типов.

Объекты могут отсутствовать.

Управляющие символы не выводятся на экран, а управляют расположением выводимых символов. Отличительной чертой управляющего символа является наличие обратного слэша ‘\’ перед ним.

Основные управляющие символы:

  • ‘\n’ - перевод строки;
  • ‘\t’ - горизонтальная табуляция;
  • ‘\v’ - вертикальная табуляция;
  • ‘\b’ - возврат на символ;
  • ‘\r’ - возврат на начало строки;
  • ‘\a’ - звуковой сигнал.

Форматы нужны для того, чтобы указывать вид, в котором информация будет выведена на экран. Отличительной чертой формата является наличие символа процент ‘%’ перед ним:

  • %d - целое число типа int со знаком в десятичной системе счисления;
  • %u - целое число типа unsigned int ;
  • %x - целое число типа int со знаком в шестнадцатеричной системе счисления;
  • %o - целое число типа int со знаком в восьмеричной системе счисления;
  • %hd - целое число типа short со знаком в десятичной системе счисления;
  • %hu - целое число типа unsigned short ;
  • %hx - целое число типа short со знаком в шестнадцатеричной системе счисления;
  • %ld - целое число типа long int со знаком в десятичной системе счисления;
  • %lu - целое число типа unsigned long int ;
  • %lx - целое число типа long int со знаком в шестнадцатеричной системе счисления;
  • %f - вещественный формат (числа с плавающей точкой типа float );
  • %lf - вещественный формат двойной точности (числа с плавающей точкой типа double );
  • %e - вещественный формат в экспоненциальной форме (числа с плавающей точкой типа float в экспоненциальной форме);
  • %c - символьный формат;
  • %s - строковый формат.

Строка форматов содержит форматы для вывода значений. Каждый формат вывода начинается с символа % . После строки форматов через запятую указываются имена переменных, которые необходимо вывести.
Количество символов % в строке формата должно совпадать с количеством переменных для вывода. Тип каждого формата должен совпадать с типом переменной, которая будет выводиться на это место. Замещение форматов вывода значениями переменных происходит в порядке их следования.
Пример на Си

1
2
3
4
5
6
7
8
9
10

#include
int main()
{
int a = 5;
float x = 2.78;
printf("a=%d\n" , a);
printf("x=%f\n" , x);
getchar();
return 0;
}

Результат работы программы

Тот же самый код может быть представлен с использованием одного вызова printf :

1
2
3
4
5
6
7
8
9

#include
int main()
{
int a = 5;
float x = 2.78;
printf("a=%d\nx=%f\n" , a, x);
getchar();
return 0;
}

Табличный вывод

При указании формата можно явным образом указать общее количество знакомест и количество знакомест, занимаемых дробной частью:

1
2
3
4
5
6
7
8

#include
int main()
{
float x = 1.2345;
printf("x=%10.5f\n" , x);
getchar();
return 0;
}


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

В приведенном примере 10 - общее количество знакомест, отводимое под значение переменной; 5 - количество позиций после разделителя целой и дробной части (после десятичной точки). В указанном примере количество знакомест в выводимом числе меньше 10, поэтому свободные знакоместа слева от числа заполняются пробелами. Такой способ форматирования часто используется для построения таблиц.


Ввод информации

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

scanf ("CтрокаФорматов" , адрес1, адрес2,...);

Строка форматов аналогична функции printf() .
Для формирования адреса переменной используется символ амперсанд ‘&’ :
адрес = &объект

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

Пример на Си

1
2
3
4
5
6
7
8
9
10
11
12
13
14

// для возможности использования scanf
#include
#include // для перехода на русский язык
int main()
{
float y;
system("chcp 1251" ); // переходим в консоли на русский язык
system("cls" ); // очищаем окно консоли
printf("Введите y: " ); // выводим сообщение
scanf("%f" , &y); // вводим значения переменной y
printf("Значение переменной y=%f" , y); // выводим значение переменной y
getchar(); getchar();
return 0;
}


Результат работы программы:

Функция scanf() является функцией незащищенного ввода, т.к. появилась она в ранних версиях языка Си. Поэтому чтобы разрешить работу данной функции в современных компиляторах необходимо в начало программы добавить строчку

#define _CRT_SECURE_NO_WARNINGS

Другой вариант — воспользоваться функцией защищенного ввода scanf_s() , которая появилась несколько позже, но содержит тот же самый список параметров.

1
2
3
4
5
6
7
8
9
10

#include
int main()
{
int a;
printf("a = " );
scanf_s("%d" , &a);
printf("a = %d" ,a);
getchar(); getchar();
return 0;
}

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

Scanf(строка_формата, адреса_переменных);

Причина, по которой в scanf() передаются адреса, а не значения переменных, очевидна. Функция scanf() должна изменять значения переменных тех функций, из которых вызывается. Единственный способ - это получить адреса областей памяти.

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

Ввод чисел, символов и строк

Пример ввода-вывода целого и вещественного чисел, символа и строки:

int a; float b; char ch, str[ 30 ] ; scanf ("%d%f%c%s" , & a, & b, & ch, str) ; printf ("%d %.3f %c %s\n " , a, b, ch, str) ;

Результат:

45 34.3456y hello 45 34.346 y hello

Здесь при выполнении программы все данные были введены в одну строку. Разделителем между числами и строками является пробел, а также любой другой символ пустого пространства (например, "\n"). Однако при считывании символа, пробел учитывается как символ; чтобы этого не произошло, в примере букву записали сразу после числа. Данные можно было бы ввести, разделяя их переходом на новую строку (опять же при этом надо иметь ввиду, как считывается символ).

В строке формата функции scanf() между спецификациями вполне допустимо поставить пробелы: %d %f %c %s . Они никакой роли не сыграют. Понятно, что данные можно было получить и так:

scanf ("%d" , & a) ; scanf ("%f" , & b) ; scanf ("%c" , & ch) ; scanf ("%s" , str) ;

Обратите внимание, перед переменной str отсутствует знак амперсанда. Это не опечатка. В последующих уроках вы узнаете, что имя массива уже само по себе является ссылкой на массив (другими словами, str содержит адрес начала массива).

В функции scanf() в спецификации формата вещественных чисел не указывается точность представления числа. Запись типа %.3f или %.10lf приведет к невозможности получить вещественное число. Чтобы получить число типа double используют формат %lf, для long double - %Lf.

Для целых чисел: длинное целое - %ld, короткое целое - %hd. Кроме того, существуют спецификации для ввода восьмеричных и шестнадцатеричных чисел.

Функция scanf() возвращает количество удачно считанных данных; т.е. значение, возвращаемое функцией, можно проанализировать и таким образом узнать, корректно ли были введены данные. Например:

int a; double b; char ch, str[ 30 ] ; ch = scanf ("%d %lf %s" , & a, & b, str) ; if (ch == 3 ) printf ("%d %.3lf %s\n " , a, b, str) ; else printf ("Error input\n " ) ;

Использование обычных символов

В строке формата scanf() допустимо использование обычных символов. В этом случае при вводе данных также должны вводится и эти символы:

int a, b, c; scanf ("%d + %d = %d" , & a, & b, & c) ; printf ("Your answer is %d\n The correct answer is %d\n " , c, a+ b) ;

В данном случае, когда программа выполняется, ввод должен выглядеть примерно так: 342+1024 = 1366. Знаки "+" и "=" обязательно должны присутствовать между числами, наличие пробелов или их отсутствие абсолютно никакой роли не играет:

45 + 839=875 Your answer is 875 The correct answer is 884

Запрет присваивания

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

float arr[ 3 ] ; int i; for (i = 0 ; i < 3 ; i++ ) scanf ("%*s %f" , & arr[ i] ) ; printf ("Sum: %.2f\n " , arr[ 0 ] + arr[ 1 ] + arr[ 2 ] ) ;

Здесь предполагается, что перед каждым числом будет вводится строка, которую следует проигнорировать, например:

First: 23.356 Second: 17.285 Third: 32.457 Sum: 73.098

Использование "шаблонов"

Для функции scanf() есть пара спецификаций формата, отдаленно напоминающих шаблоны командной оболочки и др. Формат […] позволяет получить строку, содержащую любые символы, указанные в квадратных скобках. Как только на ввод поступает символ, не входящий в указанный набор, считывание данных прекращается. Формат [^…], наоборот, помещает в строку символы, не входящие в указанный набор, до тех пор пока не встретит любой из указанных.

В примере ниже как только поступает не цифра, считывание ввода завершается. При этом если первый символ - не цифра, то в str вообще ничего не записывается:

char str[ 30 ] = "" ; scanf ("%" , str) ; printf ("%s\n " , str) ;

А в этом случае строке будет присвоена последовательность символов до любого из указанных знаков препинания:

scanf ("%[^;:,!?]" , str) ; printf ("%s\n " , str) ;

Результат:

Hello, World! Hello

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

Как только поступают некорректные данные, функция scanf() завершает свою работу. В примере:
scanf ("%d%f" , & a, & b) ;

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

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

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

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

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

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

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

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

] SCANF #include int scanf(format-string[[, argument...]]); char *format-string. строка управления форматом. Описание. Функция scanf читает данные из стандартного потока stdin в место, определяемое аргументами arguments. Каждый аргумент должен быть указателем на значение с типом, который соответствует типу, заданному в строке формата. Строка формата управляет преобразава- ниями полей ввода. Эта строка может содержать следующее: "Пробельные" символы, т.е. символ пробела " ", табуляции \t, новой строки "\n". Для функции scanf символом пробела определяет- ся считывание, но без запоминания, всех вводимых последующих сим- волов пробела вплоть до первого символа, не являющегося пробелом. При вводе один символ пробела в строке формата соответствует лю- бому числу, включая 0, или любой комбинации символов пробела. Любой символ управления, не являющийся пробелом и символом знака процента %. Тогда по этому символу для функции scanf опре- деляется считывание, но без запоминания соответствующих символов управления. Если следующий символ в не соответствует сим- волам управления, то scanf оканчивает свою работу. Спецификацию формата, введенную со знаком %. В этом случае scanf читает и преобразовывает введенные символы к значениям за- данного типа, причем значения определяются соответствующими аргу- ментами из списка аргументов. Строка формата читается слева направо. Символы вне специфи- кации формата предполагаются согласованными с последовательностью символов в потоке stdin; эти согласованные символы в stdin скани- руются, но не запоминаются. Если символ в stdin противоречит строке формата, scanf оканчивает свою работу. Этот конфликтующий символ остается в stdin, так как он не может быть прочитан. Когда встречается первая спецификация формата, тогда значение первого поля ввода преобразовывается в соответствии со спецификацией фор- мата и запоминается в месте, заданном первым аргументом. По вто- рой спецификации формата выполняется преобразование второго поля ввода и запоминание его по второму аргументу; и так до конца строки формата. Поле ввода ограничивается первым "пробельным" символом или первым символом, который не может преобразоваться по заданному формату, или случаем достижения поля width, которое идет первым. Если для выбранной спецификации формата задано больше аргу- ментов, чем требуется, то лишние аргументы игнорируются. Спецификация формата имеет следующую форму. %<.precision><{F:N:h:I}>. Каждое поле в формате спецификаций является отдельным сим- волом или числом, выражающим отдельную опцию формата. Символ type, появляющийся после последнего необязательного поля формата, определяет тип поля ввода как символьного, строкового или числен- ного. Простейший формат спецификации содержит только символ знака процента и символ типа (например, %S). Каждое поле спецификации формата описывается ниже. Если за знаком процента % следует символ, не являющийся символом управления форматом, то этот символ и идущие за ним сим- волы, вплоть до следующего знака %, трактуются как обычная после- довательность символов, т.е. последовательность, которая должна быть введена. Например, чтобы ввести символ знака %, используется комбинация %%. Звездочка (*), идущая за знаком %, подавляет назначение следующего поля ввода, задающегося как поле, определяемое типом type. Это поле сканируется, но не запоминается. Widht является положительным десятичным целым и управляет максимально возможным числом символов, считываемых из stdin. Пре- образовываются и запоминаются по соответствующему аргументу толь- ко те символы, которые не превышают width. Если в width встреча- ются "пробельные" символы, т.е. символы пробела, табуляции или новой строки, то по выбранному формату они не преобразовываются, пока не будет достигнут размер width. Необязательные префиксы F и N не учитывают принятое по умолчанию адресное соглашение используемых моделей памяти. F мо- жет быть префиксом к аргументу argument, указыващему на far-объ- ект; а N - на near-объект. Необязательный префикс l свидетельствует о том, что исполь- зуется версия long; а префикс h - указывает на использование вер- сии short. Соответствующий argument указывает на long или double-объект (при помощи префикса l) или на short-объект (при помощи префикса h). Модификаторы l и h могут использоваться вмес- те с типами символов d, i, o, x, u. Модификатор l также может ис- пользоваться с символами type e и f. Если определен любой другой type, модификаторы l и h игнорируются. Символы type и их значения описаны в таблице R.4. Таблица R.4 Типы символов функции scanf СИМВОЛ ПРЕДПОЛАГАЕМЫЙ ТИП ТИП АРГУМЕНТА ВВОДА d десятичный целый указатель на int. D десятичный целый указатель на long. o восьмеричный целый указатель на int. O восьмеричный целый указатель на long. x шестнадцатеричный указатель на int. целый X шестнадцатеричный указатель на long. целый i десятичный, вось- указатель на int. меричный или шест- надцатеричный це- лый I десятичный, вось- указатель на long. меричный или шест- надцатеричный це- лый u беззнаковый деся- указатель на unsigned тичный целый int. U беззнаковый деся- указатель на unsigned тичный целый long. e значение с плава- указатель на float f ющей точкой, со- держащее необяза- тельный знак ("+", "-"), одну или больше десятичную цифру, обычно со- держащую десятич- ную точку и экспо- ненту ("е", "Е"), которая записы- вается за знаковым целым значением. c символьный. Симво- указатель на char лы пробела, табу- ляции или новой строки, так назы- ваемые "пробельные символы", которые обычно пропускают- ся, при задании этого типа считы- ваются. Для считы- вания следующего символа, не являю- щегося "пробель- ным", используется комбинация %1s. s строковый. указатель на символь- ный массив, достаточ- но большой для вводи- мого поля вместе с нулевым символом окончания "\0", по- являющимся автомати- чески. n чтение при вводе указатель на int, в из stream или котором записывается буфера не проис- число успешно счи- ходит. танных символов из потока или буфера, вплоть до указанных в вызове scanf. p значение в форме указатель на far- xxxx: yyyy, где группу данных. цифры x и y явля- ются шестнадцате- ричными цифрами верхнего регистра. При чтении строк, не ограниченных символами пробела, мно- жество символов в квадратных скобках должно заменяться строко- вым типом s. Соответствующее поле ввода читается вплоть до перво- го символа, не содержащегося в ограниченном квадратными скобками множестве символов. Если в этом множестве первым символом являет- ся caret (^), результат сохраняется: поле ввода считывается до первого символа, не входящего в это множество символов. Чтобы за- помнить строку без нулевого символа "\0", применяется специфика- ция %nc, где n - десятичное целое. В этом случае символьный тип s определяет аргумент, который указывает на массив символов. Сле- дующие n символов считываются из входного потока в определенное местоположение и нулевой символ не записывается. Функция scanf для каждого поля ввода сканирует символ за символом. Она может окончить чтение отдельного поля при достиже- нии символа пробела, если либо достигнуто поле width; либо следу- ющий вводимый символ не может быть преобразован по заданному фор- мату; либо следующий символ конфликтует с соответствующим ему символом в управляющей строке формата; либо же следующий символ отсутствует в выбранном множестве символов. Когда происходит вы- нужденный процесс окончания считывания, то следующее поле ввода рассматривается с самого первого конфликтующего символа. Этот символ, если он один, рассматривается как непрочитанный, либо как первый символ следующего поля ввода, либо как первый символ в последующих операциях чтения потока stdin. Возвращаемое значение. Эта функция возвращает число успешно преобразованных и наз- наченных полей. В возвращаемом значении не содержится число про- читанных но не назначенных полей. При попытке считывания конца файла возвращается значение EOF. Возвращаемое значение 0 указыва- ет, что нет назначенных полей. См. также fscanf, printf , sscanf , vfprintf, vprintf, vsprintf. Пример 1. #include int i; float fp; char c, s; scanf("%d %f %c %s", &i, &fp, &c, s); /* ввод различных данных */. Пример 2. #include main () /* преобразование шестнадцатеричного ** или восьмеричного целого к ** десятичному целому */ { int numassigned, val; pintf("Enter hexadecimal or octal #, or 00 to guit:\n"); do { printf("# = "); numassigned = scanf("%i", &val); printf("Decimal # = %i\n", nal); } while (val && numassigned); /* конец цикла, если значение ввода равно 00, или если scanf не способна назначить поле */. } Тогда на выходе будет следующее. Enter hexadecimal or octal #, or 00 to guit: # = 0xf Decimal # = 15 # = 0100 Decimal # = 64 # = 00 Decimal # = 0.

Понравилась статья? Поделиться с друзьями: