Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Материалы для подготовки к экзамену по ОП.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
297.52 Кб
Скачать

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

Рассмотрим форматированный ввод функцией scanf.

int scanf(const char*, ...)

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

Формат спецификатора ввода

%[*][ширина][длинна]спецификатор

Спецификатор

Описание

Выбранные символы

i, u

Целые

Произвольное число цифр (0-9), возможно, начинающихся с + или -. Если число начинается с 0, то считывается в восьмеричном формате, если с 0x, то в шестнадцатеричном.

d

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

Произвольное число цифр (0-9), возможно, начинающихся с + или -.

o

восьмеричное целое

Произвольное число цифр (0-7), возможно, начинающихся с + или -.

x

Шестнадцатеричное целое

Произвольное число цифр (0-F), возможно, начинающихся с + или - и префикса 0x или 0X.

f, e, g, а

Число с плавающей точкой

Число, состоящее из набора цифр 0-9, возможно с десятичным разделителем (точкой). Возможно также представление в экспоненциальной форме. C99 позволяет также вводить число в шестнадцатеричном формате.

c

Символ

Если ширина не передана, то считывает один символ. Если ширина передана, то считывает нужное количество символов и размещает их в массиве БЕЗ терминального символа на конце.

s

Строка

Считывает все не пробельные символы. Если указана ширина, то не более n символов. Ставит на место n+1 символа терминальный.

p

Адрес указателя

Последовательность символов, трактуемая как адрес указателя. Формат зависит от реализации, но совпадает с тем, как выводит printf с ключом p

[символы]

Множество символов

Считывает только те символы, которые записаны в квадратных скобках, С99

[^символы]

Множество символов

Считывает только те символы, которые не указаны в квадратных скобках, С99

n

Ничего не считывает

Сохраняет число уже считанных символов по указанному адресу

Как и в printf, ширина, заданная символом * ожидает аргумента, который будт задавать ширину. Флаг длина совпадает с таким же флагом функции printf.

Примеры.

#include <stdio.h>

#include <conio.h>

void main() {

int year, month, day;

char buffer[128];

int count;

//Требует форматированного ввода, например 2013:12:12

printf("Enter data like x:x:x = ");

scanf("%d:%d:%d", &year, &month, &day);

printf("year = %d\nmonth = %d, day = %d\n", year, month, day);

//Считываем строку, не более 127 символов. При считывании в массив писать & не надо,

//так как массив подменяется указателем

printf("Enter string = ");

scanf("%127s", buffer);

printf("%s", buffer);

getch();

}

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

int getch()

int getchar()

Возвращает введённый символ, при этом не выводит его на консоль.

#include <stdio.h>

#include <conio.h>

void main() {

char c = 0;

do {

c = getch();

printf("%c", c);

} while (c != 'q');

}

Функция fgets:

char * fgets ( char * str, int num, FILE * stream )

Функция позволяет считывать строку с пробельными символами. Несмотря на то, что она работает с файлом, можно с её помощью считывать и из стандартного потока ввода. Её преимущество относительно gets в том, что она позволяет указать максимальный размер считываемой строки и заканчивает строку терминальным символом.

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

void main() {

char buffer[128];

//Считываем из стандартного потока ввода

fgets(buffer, 127, stdin);

printf("%s", buffer);

//Этим можно заменить ожидание ввода символа

scanf("1");

}

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