Перейти к содержимому

Функции стандартного ввода/вывода (printf, scanf)

    Введение

    Стандартная библиотека C/C++ включает ряд функций для чтения и записи на консоли (клавиатура и монитор). Эти функции читают и пишут данные как простой поток символов.

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

    Функция стандартного вывода printf()

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

    Функция printf() имеет прототип в файле stdio.h
    int printf(char *управляющая строка, …);

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

    Управляющая строка содержит два типа информации: символы, которые непосредственно выводятся на экран, и спецификаторы формата, определяющие, как выводить аргументы.

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

    Спецификаторы формата:

    символ
    %dцелое десятичное число
    %iцелое десятичное число
    %eдесятичное число в виде x.xx e+xx
    %Eдесятичное число в виде x.xx E+xx
    %fдесятичное число с плавающей запятой xx.xxxx
    %Fдесятичное число с плавающей запятой xx.xxxx
    %g%f или %e, что короче
    %G%F или %E, что короче
    %oвосьмеричное число
    %sстрока символов
    %uбеззнаковое десятичное число
    %xшестнадцатеричное число
    %Xшестнадцатеричное число
    %%символ %
    %pуказатель
    %nуказатель

    Кроме того, к командам формата могут быть применены модификаторы l и h.

    %ldпечать long int
    %huпечать short unsigned
    %Lfпечать long double

    В спецификаторе формата, после символа % может быть указана точность (число цифр после запятой). Точность задаётся следующим образом: %.n<код формата>. Где n — число цифр после запятой, а <код формата> — один из кодов приведённых выше.

    Например, если у нас есть переменная x=10.3563 типа float и мы хотим вывести её значение с точностью до 3-х цифр после запятой, то мы должны написать:

    printf(«Переменная x = %.3f»,x);

    Результат:
    Переменная x = 10.356

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

    printf("%5d",20);

    то результат будет следующим:
       20

    Обратите внимание на то, что число 20 напечаталось не с самого начала строки. Если вы хотите чтобы неиспользованные места поля заполнялись нулями, то нужно поставить перед шириной поля символ 0.

    Например:

    printf("%05d",20);

    Результат:
    00020

    Кроме спецификаторов формата данных в управляющей строке могут находиться управляющие символы:

    \bBS, забой
    \fНовая страница, перевод страницы
    \nНовая строка, перевод строки
    \rВозврат каретки
    \tГоризонтальная табуляция
    \vВертикальная табуляция
    Двойная кавычка
    \’Апостроф
    \\Обратная косая черта
    \0Нулевой символ, нулевой байт
    \aСигнал
    \NВосьмеричная константа
    \xNШестнадцатеричная константа
    \?Знак вопроса

    Чаще всего вы будете использовать символ \n. С помощью этого управляющего символа вы сможете переходить на новую строку. Посмотрите примеры программ и вы всё поймёте.

    Примеры программ.

    /* Пример 1 */
    #include <stdio.h>

    void main(void)
    {
        int a,b,c;        // Объявление переменных a,b,c
        a=5;
        b=6;
        c=9;
        printf("a=%d, b=%d, c=%d",a,b,c);
    }

    Результат работы программы:
    a=5, b=6, c=9

    /* Пример 2 */
    #include <stdio.h>

    void main(void)
    {
        float x,y,z;

        x=10.5;
        y=130.67;
        z=54;

        printf("Координаты объекта: x:%.2f, y:%.2f, z:%.2f", x, y, z);
    }

    Результат работы программы:
    Координаты объекта: x:10.50, y:130.67, z:54.00

    /* Пример 3 */
    #include <stdio.h>

    void main()
    {
        int x;

        x=5;
        printf("x=%d", x*2);
    }

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

    /* Пример 4 */
    #include <stdio.h>

    void main(void)
    {
        printf("\"Текст в кавычках\"");
        printf("\nСодержание кислорода: 100%%");
    }

    Результат работы программы:
    «Текст в кавычках»
    Содержание кислорода: 100%

    /* Пример 5 */
    #include <stdio.h>

    void main(void)
    {
        int a;

        a=11;        // 11 в десятичной равно b в шестнадцатеричной
        printf("a-dec=%d, a-hex=%X",a,a);
    }

    Результат работы программы:
    a-dec=11, a-hex=b

    /* Пример 6 */
    #include <stdio.h>

    void main(void)
    {
        char ch1,ch2,ch3;

        ch1='A';
        ch2='B';
        ch3='C';

        printf("%c%c%c",ch1,ch2,ch3);
    }

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

    /* Пример 7 */
    #include <stdio.h>

    void main(void)
    {
        char *str="Моя строка.";

        printf("Это %s",str);
    }

    Результат работы программы:
    Это Моя строка.

    /* Пример 8 */
    #include <stdio.h>

    void main(void)
    {
        printf("Здравствуйте!\n");     // После печати будет переход на новую строку - \n
        printf("Меня зовут Павел.");  // Это будет напечатано на новой строке
    }

    Результат работы программы:
    Здравствуйте!
    Меня зовут Павел.

    Функция стандартного ввода scanf()

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

    Функция scanf() имеет следующий прототип в файле stdio.h:
    int scanf(char *управляющая строка);

    Функция возвращает число переменных которым было присвоено значение.

    Управляющая строка содержит три вида символов: спецификаторы формата, пробелы и другие символы. Спецификаторы формата начинаются с символа %.

    Спецификаторы формата:

    %cчтение символа
    %dчтение десятичного целого
    %iчтение десятичного целого
    %eчтение числа типа float (плавающая запятая)
    %hчтение short int
    %oчтение восьмеричного числа
    %sчтение строки
    %xчтение шестнадцатеричного числа
    %pчтение указателя
    %nчтение указателя в увеличенном формате

    При вводе строки с помощью функции scanf() (спецификатор формата %s), строка вводиться до первого пробела!! т.е. если вы вводите строку «Привет мир!» с использованием функции scanf()

    char str[80];        // массив на 80 символов
    scanf(«%s»,str);

    то после ввода результирующая строка, которая будет храниться в массиве str будет состоять из одного слова «Привет». ФУНКЦИЯ ВВОДИТ СТРОКУ ДО ПЕРВОГО ПРОБЕЛА! Если вы хотите вводить строки с пробелами, то используйте функцию 

    char *gets( char *buf );

    С помощью функции gets() вы сможете вводить полноценные строки. Функция gets() читает символы с клавиатуры до появления символа новой строки (\n). Сам символ новой строки появляется, когда вы нажимаете клавишу enter. Функция возвращает указатель на buf. buf — буфер (память) для вводимой строки.

    Хотя gets() не входит в тему этой статьи, но всё же давайте напишем пример программы, которая позволяет ввести целую строку с клавиатуры и вывести её на экран.

    #include <stdio.h>

    void main(void)
    {
        char buffer[100];       // массив (буфер) для вводимой строки

        gets(buffer);            // вводим строку и нажимаем enter
        printf("%s",buffer);    // вывод введённой строки на экран
    }

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

    Что значит адрес? Попробую объяснить. В программе у нас есть переменная. Переменная хранит своё значение в памяти компьютера. Так вот адрес, который мы получаем с помощью & это адрес в памяти компьютера где храниться значение переменной. 

    Давайте рассмотрим пример программы, который показывает нам как использовать &

    #include <stdio.h>

    void main(void)
    {
        int x;

        printf("Введите переменную x:");
        scanf("%d",&x);
        printf("Переменная x=%d",x);
    }

    Теперь давайте вернёмся к управляющей строке функции scanf(). Ещё раз:

    int scanf(char *управляющая строка);

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

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

    Например:

    scanf(«%d%*c%d»,&i,&j);

    при вводе 50+20 присвоит переменной i значение 50, переменной j — значение 20, а символ + будет прочитан и проигнорирован.

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

    Например:

    scanf(«%5s»,str);

    указывает необходимость прочитать из потока ввода первые 5 символов. При вводе 1234567890ABC массив str будет содержать только 12345, остальные символы будут проигнорированы. Разделители: пробел, символ табуляции и символ новой строки — при вводе символа воспринимаются, как и все другие символы.

    Если в управляющей строке встречаются какие-либо другие символы, то они предназначаются для того, чтобы определить и пропустить соответствующий символ. Поток символов 10plus20 оператором

    scanf(«%dplus%d»,&x,&y);

    присвоит переменной x значение 10, переменной y — значение 20, а символы plus пропустит, так как они встретились в управляющей строке.

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

    #include <stdio.h>

    void main(void)
    {
        char str1[10], str2[10];
        scanf("%[0123456789]%s", str1, str2);
        printf("\n%s\n%s",str1,str2);
    }
    Введём набор символов:
    12345abcdefg456

    На экране программа выдаст:
    12345
    abcdefg456

    При задании множества поиска можно также использовать символ «дефис» для задания промежутков, а также максимальную ширину поля ввода.

    scanf(«%10[A-Z1-5]», str1);

    Можно также определить символы, которые не входят в множество поиска. Перед первым из этих символов ставиться знак ^. Множество символов различает строчные и прописные буквы.

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

    char str[80];        // массив на 80 символов
    scanf(«%s»,str);

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

    Примеры программ.

    Пример 1.
    Эта программа выводит на экран запрос «Сколько вам лет?:» и ждёт ввода данных. Если, например, ввести число 20, то программа выведет строку «Вам 20 лет.». При вызове функции scanf(), перед переменной age мы поставили знак &, так как функции scanf() нужны адреса переменных. Функция scanf() запишет введённое значение по указанному адресу. В нашем случае введённое значение 20 будет записано по адресу переменной age.

    /* Пример 1 */

    #include <stdio.h>

    void main(void)
    {
        int age;

        printf("\nСколько вам лет?:");
        scanf("%d",&age);
        printf("Вам %d лет.", age);
    }

    Пример 2.
    Программа калькулятор. Этот калькулятор может только складывать числа. При вводе 100+34 программа выдаст результат: 100+34=134.

    /* Пример 2 */

    #include <stdio.h>

    void main(void)
    {
        int x, y;

        printf("\nКалькулятор:");
        scanf("%d+%d", &x, &y);
        printf("\n%d+%d=%d", x, y, x+y);
    }

    Пример 3.
    Этот пример показывает как установить ширину поля считывания. В нашем примере ширина поля равна пяти символам. Если вы введёте строку с большим количеством символов, то все символы после 5-го будут отброшены. Обратите внимание на вызов функции scanf(). Знак & не стоит перед именем массива name так как имя массива name является адресом первого элемента массива.

    /* Пример 3 */

    #include <stdio.h>

    void main(void)
    {
        char name[5];

        printf("\nВведите ваш логин (не более 5 символов):");
        scanf("%5s", name);
        printf("\nВы ввели %s", name);
    }

    Пример 4.
    Последний пример в этой статье показывает как можно использовать множество поиска. После запуска программы введите число от 2 до 5.

    /* Пример 4 */

    #include <stdio.h>

    void main(void)
    {
        char bal;

        printf("Ваша оценка 2,3,4,5:");
        scanf("%[2345]", &bal);
        printf("\nОценка %c", bal);
    }

    Добавить комментарий

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