Форматированный ввод/вывод 1
Содержание 9.1Введение 9.2Потоки 9.3 Форматирование при выводе с помощью printf 9.4Печать Integer 9.5Печать дробных чисел 9.6Печать строк и символов 9.7Другие указатели типа 9.8Печать с указанными длиной поля и точностью 9.9Использование флагов в строке формата printf 9.10 Печать литералов и Esc последовательностей 9.11 Форматирование ввода с помощью scanf 2
9.1Введение Отображение результатов Scanf и printf Потоки (ввод и вывод) gets, puts, getchar, putchar (в ) 3
9.2Потоки Последовательности символов организованные в виде строк Каждая линия состоит из 0 или более символов и заканчивается символом перевода строки ANSI C поддерживает строки с длиной по крайней мере 254 символа Осуществляют ввод/вывод Часто могут перенаправляться Стандартный ввод – клавиатура Стандартный вывод – экран Стандартная ошибка – экран 4
9.3Форматирование при выводе с помощью printf printf Аккуратное форматирование Что указывается: флаги, ширина поля, точность, итд. Может выполнять округление, выравнивание столбцов, выравнивание слева/справа, вставку спецсимволов, формат с плавающей точкой, 16 личный формат, фиксированную ширину и точность Формат printf( строчка-управления-форматом, другие- аргументы ); Строка управления форматом: задает выходной формат Другие аргументы: соответствуют каждому флагу в строке управления форматом Начинается с ( % ), заканчивается после указания типа 5
9.4Печать Integer Число (нет точки): 25, 0, -9 Положительное, отрицательное, ноль Знак минус по умолчанию печатается 6
Печать Результат 7 1/* Fig 9.2: fig09_02. c */ 2/* Using the integer conversion specifiers */ 3#include 4 5int main() 6{6{ 7 printf( "%d\n", 455 ); 8 printf( "%i\n", 455 ); /* i same as d in printf */ 9 printf( "%d\n", +455 ); 10 printf( "%d\n", -455 ); 11 printf( "%hd\n", ); 12 printf( "%ld\n", ); 13 printf( "%o\n", 455 ); 14 printf( "%u\n", 455 ); 15 printf( "%u\n", -455 ); 16 printf( "%x\n", 455 ); 17 printf( "%X\n", 455 ); return 0; 20} c7 1C7
9.5Печать дробных чисел У них есть точка ( 33.5 ) Экспоненциальная нотация это x 10² это 1.503E+02 в экспоненциальном виде используем e или E f – печатает число с плавающей запятой, с по крайней мере 1 цифрой слева от числа g (или G ) – печатает f или e без оканчивающихся нулей ( станет 1.23 ) Используйте экспоненту если она меньше чем -4, или больше чем точность по умолчанию ( 6 цифр) 8
Печать Результат 9 1/* Fig 9.4: fig09_04. c */ 2/* Printing floating-point numbers with 3 floating-point conversion specifiers */ 4 5#include 6 7int main() 8{8{ 9 printf( "%e\n", ); 10 printf( "%e\n", ); 11 printf( "%e\n", ); 12 printf( "%E\n", ); 13 printf( "%f\n", ); 14 printf( "%g\n", ); 15 printf( "%G\n", ); return 0; 18} e e E e E+006
9.6Печать строк и символов c Печатает аргумент типа char Нельзя использовать для печати первого символа строки s Требует указателя на char Печатает символы до ( '\0 ) Не может печатать аргументы типа char Помните Одиночные кавычки для символов ( 'z' ) Двойные для строк "z" (на самом деле содержит 'z и '\0' ) 10
Инициализация Печать Результат 11 1/* Fig 9.5: fig09_05c */ 2/* Printing strings and characters */ 3#include 4 5int main() 6{6{ 7 char character = 'A'; 8 char string[] = "This is a string"; 9 const char *stringPtr = "This is also a string"; printf( "%c\n", character ); 12 printf( "%s\n", "This is a string" ); 13 printf( "%s\n", string ); 14 printf( "%s\n", stringPtr ); return 0; 17} A This is a string This is also a string
9.7Другие описатели формата p Значение указателя (адрес) n Сохраняет количество символов, уже напечатанных текущим выводом printf Получает указатель на целое как аргумент Ничего не печатает если указано %n Каждый вызов printf возвращает значение Количество выведенных символов Отрицательное число - ошибка % Печатает знак процента % 12
Инициализация Печать Результат 13 1/* Fig 9.7: fig09_07. c */ 2/* Using the p, n, and % conversion specifiers */ 3#include 4 5int main() 6{6{ 7 int *ptr; 8 int x = 12345, y; 9 10 ptr = &x; 11 printf( "The value of ptr is %p\n", ptr ); 12 printf( "The address of x is %p\n\n", &x ); printf( "Total characters printed on this line is:%n", &y ); 15 printf( " %d\n\n", y ); y = printf( "This line has 28 characters\n" ); 18 printf( "%d characters were printed\n\n", y ); printf( "Printing a % in a format control string\n" ); return 0; 23} The value of ptr is 0065FDF0 The address of x is 0065FDF0 Total characters printed on this line is: 41 This line has 28 characters 28 characters were printed Printing a % in a format control string
9.8Печать с заданными шириной полей и точностью Ширина поля Размер поля в котором данные будут напечатаны Если поле шире данных, по умолчанию правая часть будет выровнена Если поле слишком маленькое, оно будет увеличено чтобы поместить все данные Знак минус занимает 1 позицию в поле Целое между % и типом %4d – ширина поля 4 14
9.8Печать с заданными шириной полей и точностью Точность Значение зависит от типа данных Целые (по умолчанию 1 ) Минимальное количество цифр для печати Если данные малы – добиваем нулями С плавающей точкой Количество цифр после целых ( e и f ) Для g – максимальное количество значащих цифр Строки Максимальное количество символов для печати из строки Формат Используйте точку (. ) когда указываете формат после % %.3f 15
9.8Печать с заданными шириной полей и точностью Ширина поля и точность Можно указать оба %width.precision %5.3f Отрицательная ширина поля – выравнивание слева Положительная ширина поля - выравнивание справа Точность может быть положительная Можно использовать выражения integer для определения ширины поля и точности Поместите ( * ) на место ширины и точности Соответствует целому аргументу в спискеt Пример: printf( "%*.*f", 7, 2, ); 16
Инициализация Печать Результат 17 1/* Fig 9.9: fig09_09. c */ 2/* Using precision while printing integers, 3 floating-point numbers, and strings */ 4#include 5 6int main() 7{7{ 8 int i = 873; 9 double f = ; 10 char s[] = "Happy Birthday"; printf( "Using precision for integers\n" ); 13 printf( "\t%.4d\n\t%.9d\n\n", i, i ); 14 printf( "Using precision for floating-point numbers\n" ); 15 printf( "\t%.3f\n\t%.3e\n\t%.3g\n\n", f, f, f ); 16 printf( "Using precision for strings\n" ); 17 printf( "\t%.11s\n", s ); return 0; 20} Using precision for integers Using precision for floating-point numbers e Using precision for strings Happy Birth
9.9Использование флагов printf Расширенные возможности для форматирования Флаг нужно разместить справа от процента Можно комбинировать 18
Печать Результат 19 1/* Fig 9.11: fig09_11. c */ 2/* Right justifying and left justifying values */ 3#include 4 5int main() 6{6{ 7 printf( "%10s%10d%10c%10f\n\n", "hello", 7, 'a', 1.23 ); 8 printf( "%-10s%-10d%-10c%-10f\n", "hello", 7, 'a', 1.23 ); 9 return 0; 10} hello 7 a hello 7 a
Инициализация Печать Результат 20 1/* Fig 9.14: fig09_14. c */ 2/* Using the # flag with conversion specifiers 3 o, x, X and any floating-point specifier */ 4#include 5 6int main() 7{7{ 8 int c = 1427; 9 double p = ; printf( "%#o\n", c ); 12 printf( "%#x\n", c ); 13 printf( "%#X\n", c ); 14 printf( "\n%g\n", p ); 15 printf( "%#g\n", p ); return 0; 18} x593 0X
9.10 Печать литералов и Esc последовательностей Печать литералов Большинство символов может быть напечатано Несколько «проблемных» символов, например кавычки " Должны быть представлены как escape последовательность Используем обратный слеш \ за которым следует escape символ 21
9.10 Печать литералов и Esc последовательностей Table of all escape sequences 22
9.11 Форматирование ввода с помощью Scanf scanf Форматирование ввода Возможности Ввод любых типов данных Ввод любых спец символов Пропуск нужных символов Формат Scanf (строка-управления-форматом, другие- аргументы); Строка-управления-форматом Описывает формат ввода Другие-аргументы Указывает на переменные где ввод необходимо сохранить Можно указать длину для чтения определенного количества символов из потока 23
9.11 Форматирование ввода с помощью Scanf 24
9.11 Форматирование ввода с помощью Scanf Table continued from previous slide 25
9.11 Форматирование ввода с помощью Scanf Наборы сканирования Набор символов, заключенных в квадратные скобки [] Начинаются со знака % Сканируем входной поток, смотрим только на символы из набора Если совпали – сохраняем в указанный массив Стоп если символы из набора не найдены Инвертированные наборы Используем домик ^ : [^aeiou] Ищем не входящие в набор символы Пропуск символов используйте * (подавление присваивания) Пропустить любой тип символа без сохранения 26
Инициализация Ввод Печать Результат 27 1/* Fig 9.20: fig09_20. c */ 2/* Reading characters and strings */ 3#include 4 5int main() 6{6{ 7 char x, y[ 9 ]; 8 9 printf( "Enter a string: " ); 10 scanf( "%c%s", &x, y ); printf( "The input was:\n" ); 13 printf( "the character \"%c\" ", x ); 14 printf( "and the string \"%s\"\n", y ); return 0; 17} Enter a string: Sunday The input was: the character "S" and the string "unday"
Инициализация Ввод Печать Результат 28 1/* Fig 9.22: fig09_22. c */ 2/* Using an inverted scan set */ 3#include 4 5int main() 6{6{ 7 char z[ 9 ] = { '\0' }; 8 9 printf( "Enter a string: " ); 10 scanf( "%[^aeiou]", z ); 11 printf( "The input was \"%s\"\n", z ); return 0; 14} Enter a string: String The input was "Str"
Ввод Печать Результат 29 1/* Fig 9.24: fig09_24. c */ 2/* Reading and discarding characters from the input stream */ 3#include 4 5int main() 6{6{ 7 int month1, day1, year1, month2, day2, year2; 8 9 printf( "Enter a date in the form mm-dd-yyyy: " ); 10 scanf( "%d%*c%d%*c%d", &month1, &day1, &year1 ); 11 printf( "month = %d day = %d year = %d\n\n", 12 month1, day1, year1 ); 13 printf( "Enter a date in the form mm/dd/yyyy: " ); 14 scanf( "%d%*c%d%*c%d", &month2, &day2, &year2 ); 15 printf( "month = %d day = %d year = %d\n", 16 month2, day2, year2 ); return 0; 19} Enter a date in the form mm-dd-yyyy: month = 11 day = 18 year = 2000 Enter a date in the form mm/dd/yyyy: 11/18/2000 month = 11 day = 18 year = 2000