Форматированный ввод данных. Форматированный ввод и вывод

#include
int scanf (const char *format, ...);

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

В версии С99 к параметру format применен квалификатор restrict .

Управляющая строка, задаваемая параметром format , состоит из символов трех категорий:

  • спецификаторов формата;
  • пробельных символов;
  • символов, отличных от пробельных.

  • Спецификации формата начинаются знаком % и сообщают функции scanf() тип данного, которое будет прочитано. Например, по спецификации %s будет прочитана строка, а по спецификации %d - целое значение. Строка форматирования читается слева направо, и спецификации формата сопоставляются аргументам в порядке их перечисления в списке аргументов.

    Спецификации формата функции scanf() :
    Читает значение с плавающей точкой (только С99)
    Аналогично коду (только С99)
    Читает один символ
    %d Читает десятичное целое
    %i Читает целое в любом формате (десятичное, восьмеричное или шести ад цате ричное)

    Аналогично коду
    %f Читает число с плавающей точкой
    %F Аналогично коду %f (только С99)
    %g Читает число с плавающей точкой
    %G Аналогично коду %g
    %o Читает восьмеричное число
    %s Читает строку
    Читает шести ад цате ричное число
    Аналогично коду
    Читает указатель
    %n Принимает целое значение, равное количеству прочитанных до сих пор символов
    %u Читает десятичное целое без знака
    % Просматривает набор символов
    %% Читает знак процента

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

    Современные компиляторы, поддерживаюшие добавленные в 1995 году средства работы с двухбайтовыми символами, позволяют к спецификации с применить модификатор l ; тогда будет считаться, что соответствующий указатель указывает на двухбайтовый символ (т.е. на данное типа wchar_t ). Модификатор l также можно использовать с кодом формата s ; тогда будет считаться, что соответствующий указатель указывает на строку двухбайтовых символов. Кроме того, модификатор l можно использовать для того, чтобы указать, что набор сканируемых символов состоит из двухбайтовых символов.

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

    Если в строке форматирования встретился символ, отличный от разделителя, то функция scanf() прочитает и отбросит его. Например, если в строке форматирования встретится %d , %d , то функция scanf() сначала прочитает целое значение, затем прочитает и отбросит запятую и, наконец, прочитает еще одно целое. Если заданный символ не найден, функция scanf() завершает работу.
    Все переменные, получающие значения с помощью функции scanf() , должны передаваться посредством своих адресов. Это значит, что все аргументы должны быть указателями на переменные.
    Элементы входного потока должны быть разделены пробелами, символами табуляции или разделителями строк. Такие символы, как запятая, точка с запятой и т.п., не распознаются в качестве разделителей. Это означает, что оператор
    scanf ("%d%d", &r, &c); примет значения, введенные как 10 20, но откажется от последовательности символов 10,20.

    Символ * , стоящий после знака % и перед кодом формата, прочитает данные заданного типа, но запретит их присваивание. Следовательно, оператор
    scanf ("%d%*c%d", &x, &y); при вводе данных в виде 10/20 поместит значение 10 в переменную х, отбросит знак деления и присвоит значение 20 переменной у.

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

    Хотя пробелы, символы табуляции и разделители строк используются в качестве разделителей полей, при чтении одиночного символа они читаются подобно любому другому символу. Например, если входной поток состоит из символов х у, то оператор
    scanf ("%c%c%c", &a, &b, &c); поместит символ х в переменную а, пробел - в переменную b, а символ у - в переменную с.

    Помните, что любые символы управляющей строки (включая пробелы, символы табуляции и новой строки), не являющиеся спецификациями формата, используются для установки соответствия и отбрасывания символов из входного потока. Любой соответствующий им символ отбрасывается. Например, если поток ввода выглядит, как 10t20, оператор
    scanf ("%dt%d", &x, &y); присвоит переменной х значение 10, а переменной у - значение 20. Символ t отбрасывается, так как он присутствует в управляющей строке.

    Функция scanf() поддерживает спецификатор формата общего назначения, называемый набором сканируемых символов (scanset) , В этом случае определяется набор символов, которые могут быть прочитаны функцией scanf() и присвоены соответствующему массиву символов. Для определения такого набора символы, подлежащие сканированию, необходимо заключить в квадратные скобки. Открывающая квадратная скобка должна следовать сразу за знаком процента. Например, следующий набор сканируемых символов указывает на то, что необходимо читать только символы А, B и С.
    % При использовании набора сканируемых символов функция scanf() продолжает читать символы и помещать их в соответствующий массив символов до тех пор, пока не встретится символ, отсутствующий в заданном наборе. Соответствующая набору переменная должна быть указателем на массив символов. При возврате из функции scanf() этот массив будет содержать строку из прочитанных символов, завершающуюся символом конца строки.

    Если первый символ в наборе является знаком ^ , то получаем обратный эффект: входное поле читается до тех пор, пока не встретится символ из заданного набора сканируемых символов, т.е. знак ^ заставляет функцию scanf() читать только те символы, которые отсутствуют в наборе сканируемых символов.
    Во многих реализациях допускается задавать диапазон с помощью дефиса. Например, функция scanf() , встречая набор сканируемых символов в виде % , будет читать символы, попадающие в диапазон от А до Z.

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

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

    Модификаторы формата, добавленные к функции scanf() Стандартом С99

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

    Модификатор формата j d , i , о , u , х и n , означает, что соответствующий аргумент является указателем на значение типа intmax_t или uintmax_t . Эти типы объявлены в заголовке и служат для хранения целых максимально возможной разрядности.

    Модификатор формата z , который применяется к спецификациям d , i , о , u , х и n size_t и служит для хранения результата операции sizeof .

    Модификатор формата t , который применяется к спецификациям d , i , о , u , х и n , означает, что соответствующий аргумент является указателем на объект типа ptrdiff_t . Этот тип объявлен в заголовке и служит для хранения значения разности между двумя указателями.

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

    Ввод и вывод информации осуществляется через функции стандартной библиотеки. Прототипы рассматриваемых функций находятся в файле 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() дают нам возможность взаимодействовать с программой. Мы называем их функциями ввода-вывода. Это не единственные функции, которыми мы можем воспользоваться для ввода и вывода данных с помощью программ на языке Си, но они наиболее универсальны. Эти функции входят в описание языка Си и они даны в библиотеке stdio.h. Обычно функции printf() и scanf() работают во многом одинаково - каждая использует управляющую строку и список аргументов. Сначала мы рассмотрим работу функции printf(), затем scanf().

    Формат

    Тип выводимой информации

    десятичное целое число

    один символ

    строка символов

    экспоненциальная запись

    число с плавающей точкой, десятичная запись

    используется вместо записи %f или %e

    десятичное целое число без знака

    восьмеричное целое число без знака

    шестнадцатеричное целое число без знака

    Инструкции, передаваемые функции printf(), когда мы хотим напечатать некоторую переменную, зависят от того, какого типа эта переменная. Например, при выводе на печать целого числа применяется формат %d, а при выводе символа - %c. Форматы перечислены в таблице.

    Посмотрим теперь, как эти формы применяются:

    /* печать */

    #include

    #define PI 3.14159

    int number = 2003;

    printf("Интернет-университет информационных технологий был открыт в %d году \n", number);

    printf("Значение числа pi равно %f.\n", PI);

    Формат, указываемый при обращении к функции printf(), выглядит следующим образом:

    printf(Управляющая строка, аргумент1, аргумент2,_);

    аргумент 1, аргумент 2 и т.д. - это печатаемые параметры, которые могут быть переменными, константами или даже выражениями , вычисляемыми перед выводом на печать.

    Управляющая строка - строка символов, показывающая, как должны быть напечатаны параметры. Например, в операторе

    printf("%d студентов получили оценку %f.\n",

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

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

      Символы, печатаемые текстуально.

      Идентификаторы данных, называемые также спецификациями преобразования .

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

    printf("Эта книга не очень дорогая!\n");

    printf("%c%d\n","$",cost);

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

    Например:

    printf("Только %d%% населения способно учиться самостоятельно! \n",i);

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

    Только 5% населения способно учиться самостоятельно!

    Мы можем расширить основное определение спецификации преобразования , поместив модификаторы между знаком % и символом, определяющим тип преобразования. При использовании одновременно нескольких модификаторов они должны быть указаны в том порядке, в котором перечислены в таблице.

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

    Значение

    Аргумент будет печататься с левой позиции поля заданной ширины. Обычно печать аргумента оканчивается в самой правой позиции поля. Пример: %-10

    строка цифр

    Задает минимальную ширину поля. Большее поле будет использоваться, если печатаемое число или строка не помещается в исходном поле Пример: %4d

    строка цифр

    Определяет точность: для типов данных с плавающей точкой число печатаемых цифр справа от десятичной точки; для символьных строк - максимальное число печатаемых символов Пример:

    %4.2f(две десятичные цифры для поля шириной в четыре символа)

    Соответствующий элемент данных имеет тип long, а не int Пример: %ld

    printf("/%d/\n",135);

    printf("/%2d/\n",135);

    printf("/%10d/\n",135);

    printf("/%-10d/\n",135);

    Первая спецификация преобразования %d не содержит модификаторов. Это так называемый выбор по умолчанию, т. е. результат действия компилятора в случае, если вы не дали ему никаких дополнительных инструкций. Вторая спецификация преобразования - %2d. Она указывает, что ширина поля должна равняться 2, но, поскольку число состоит из трех цифр, поле автоматически расширяется до необходимого размера. Следующая спецификация %10d показывает, что ширина поля равна 10. Последняя спецификация %-10d также указывает ширину поля, равную 10, а знак - приводит к сдвигу всего числа к левому краю.

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

    В версии С99 к параметру format применен квалификатор restrict.

    Управляющая строка, задаваемая параметром format, состоит из символов трех категорий:

    • спецификаторов формата;
    • пробельных символов;
    • символов, отличных от пробельных.

    Спецификаторы формата - им предшествует знак процента(%) - сообщают, какого типа данное будет прочитано следующим. Например, спецификатор %s прочитает строку, а %d - целое значение. Строка форматирования читается слева направо, и спецификаторы формата по порядку сопоставляются с аргументами, перечисленными в списке аргументов. Эти коды приведены в следующей таблице.

    Код Назначение
    Читает значение с плавающей точкой(только С99)
    Аналогично коду %a (только С99)
    Читает один символ
    %d Читает десятичное целое
    %i Читает целое в любом формате(десятичное, восьмеричное, шестнадцатеричное)
    Читает вещественное число
    Аналогично коду %е
    %f Читает вещественное число
    %F Аналогично коду %f(только С99)
    %g Читает вещественное число
    %G Аналогично коду %g
    Читает восьмеричное число
    %s Читает строку
    Читает шестнадцатеричное число
    %X Аналогично коду %х
    Читает указатель
    %n Принимает целое значение, равное количеству символов, прочитанных до сих пор
    %u Читает десятичное целое без знака
    % Просматривает набор символов
    %% Читает знак процента

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

    Если вы используете современный компилятор, который поддерживает добавленные в 1995 году средства работы с двухбайтовыми символами, можете задействовать модификатор l применительно к спецификатору с, чтобы обозначить указатель на двухбайтовый символ с типом данных whcar_t. Модификатор l можно также использовать с кодом формата s, чтобы обозначить указатель на строку двухбайтовых символов. Кроме того, модификатор l можно использовать для модификации набора сканируемых двухбайтовых символов.

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

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

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

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

    Scanf("%d%d", &r, &c);

    примет значения, введенные как 10 20, но наотрез откажется от "блюда", поданного в виде 10,20.

    Символ *, стоящий после знака % и перед кодом формата, прочитает данные заданного типа, но запретит их присваивание. Следовательно, оператор

    Scanf("%d%*c%d", &х, &у);

    при вводе данных в виде 10/20 поместит значение 10 в переменную х, отбросит знак деления и присвоит значение 20 переменной у.

    Команды форматирования могут содержать модификатор максимальной длины поля. Он представляет собой целое число, располагаемое между знаком % и кодом формата, которое ограничивает количество символов, читаемых для любого поля. Например, если вы хотите прочитать в переменную address не более 20 символов, используйте следующий оператор.

    Scanf("%20s", address);

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

    Несмотря на то что пробелы, символы табуляции и новой строки используются в качестве разделителей полей, при чтении одиночного символа они читаются подобно любому другому символу. Например, если входной поток состоит из символов х у, то оператор

    Scanf("%с%с%с", &а, &Ь, &с);

    поместит символ х в переменную а, пробел - в переменную Ь и символ у - в переменную с.

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

    Scanf("%st%s", &х, &у);

    поместит 10 в переменную х и 20 - в переменную у. Символ t отбрасывается, так как он присутствует в управляющей строке.

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

    %[АВС]

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

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

    Многие компиляторы позволяют с помощью дефиса задать диапазон. Например, следующий оператор заставляет функцию scanf() принимать символы от А до Z.

    Важно помнить, что набор сканируемых символов различает прописные и строчные буквы. Следовательно, если вы хотите сканировать как прописные, так и строчные буквы, задайте их отдельно.

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

    Модификаторы формата, добавленные к функции scanf() стандартом С99

    В версии С99 добавлено несколько модификаторов формата для использования в функции scanf(): hh, ll, j, z и t. Модификатор hh можно применять к спецификаторам d, i, о, и, х и п. Он означает, что соответствующий аргумент является указателем на значение типа signed char или unsigned char. Модификатор ll также можно применять к спецификаторам d, i, о, и, х и п. Он означает, что соответствующий аргумент является указателем на значение типа signed long long int или unsigned long long int.

    Модификатор формата j, который применяется к спецификаторам d, i, о, и, х и n, означает, что соответствующий аргумент является указателем на значение типа intmax_t или uintmax_t. Эти типы объявлены в заголовке и служат для хранения целых максимально возможной длины.

    Модификатор формата z, который применяется к спецификаторам d, i, о, u, x и n, означает, что соответствующий аргумент является указателем на объект типа size_t. Этот тип объявлен в заголовке и служит для хранения результата операции sizeof.

    Модификатор формата t, который применяется к спецификаторам d, i, о, u, x и n, означает, что соответствующий аргумент является указателем на объект типа ptrdiff_t. Этот тип объявлен в заголовке и служит для хранения значения разности между двумя указателями.



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