Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика 1.docx
Скачиваний:
11
Добавлен:
26.09.2019
Размер:
364.88 Кб
Скачать

Для чего нужен форматированный вывод.

Задание фиксированной ширины поля оказывается полезным при печати данных столбцами.

Поскольку ширина поля по умолчанию является "ширина" числа, то для печати столбиками достаточно задавать фиксированную ширину поля для каждой переменной (иначе числа будут сдвигаться)

printf("%9d %9d %9d\n",val1, val2, val3);

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

12 234 1222

4 5 23

1224 2225 10245

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

12 234 1222

4 5 23

1224 2225 10245

Функция scanf().

Осуществляет ввод значений с клавиатуры.

Синтаксис:

int scanf (const char* FormatString, [void* arg1, void* arg2,]…);

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

Пример:

main ()

{

int age;

char name[255];

printf("Введите ваш возраст \n")

scanf("%d",&age); // Сообщаем указатель на переменную

printf("Введите ваше имя \n")

scanf("%d",name); // Сообщаем имя массива – он сам

// работает как указатель.

}

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

Отсутствует спецификация %g.

Спецификации %f и %е эквивалентны.

Для чтения целых чисел типа short применяется спецификация %h.

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

Например, немного модифицируем предыдущую программу:

main ()

{

int age;

char name[255];

printf("Введите ваше имя и возраст через пробел\n")

scanf("%s %d",name,&age);

}

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

Если же в функции scanf форматирующую строку записать следующим образом:

scanf("%s , %d",name,&age);

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

Функции sprintf() и sscanf().

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

int sprintf (char *buffer, const char * FormatString, [arg1, arg2,]…);

int sscanf (const char *buffer, const char* FormatString, [void* arg1, void* arg2,]…);

Пример: функция перевода чисел из десятичной системы в шестнадцатеричную. Исходное число передаваётся в виде переменной типа int, результат возвращается в виде строки по переданному указателю.

void DecToHex(int src, char *pDest)

{

sprintf(pDest,"%x",src)

}