Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Форматування введення-виведення засобами мови С




Функція printf()

int printf(const char *control-str[, argument1 [, argument2 [, ... ]]]);

Ця функція повертає при вдалому збігу обставин кількість виведених символів, інакше поверне код помилки.

Параметр control-str (управляючий рядок) - це рядок в подвійних лапках. Даний параметр може бути єдиним у функції. Наприклад: рядок коду

printf("Нello, everybody! \n It's me again.");виведе на екран Hello, everybody! It's me again.

Параметри argument1, argument2 і т.д. - це ті елементи, які необхідно вивести на екран. Вони можуть бути змінними або константами або навіть виразами, значення яких обчислюється при виведенні на друк.

Якщо у функції є хоч один параметр argument, управляючий рядок повинен містити специфікатор перетворення для нього. Для кожного параметра argument необхідний специфікатор перетворення. Самі специфікатори перераховані в таблиці.

Специфікатор перетворення Результат  
%c одиночний символ
%d десяткове ціле число
%e число з плаваючою крапкою, експоненціальне представлення (e-представлення)
%E число з плаваючою крапкою, експоненціальне представлення (E- представлення)
%f число з плаваючою крапкою, десяткове представлення
%g використовує %f або %e, залежно від значення. %e використовується, якщо показник експоненти менше ніж -4 або більше або рівний заданій точності
%G використовує %f або %E, залежно від значення. %E використовується, якщо показник експоненти менше ніж -4 або більше або рівний заданій точності
%i десяткове ціле число із знаком
%o вісімкове ціле число без знаків
%p покажчик
%s рядок символів
%u десяткове ціле число без знаку
%x шістнадцяткове ціле число без знаку, використання шістнадцяткових цифр від 0 до f
%X шістнадцяткове ціле число без знаку, використання шістнадцяткових цифр від 0 до F
%% друк знаку відсотка
                           

Елементи, які необхідно вивести на екран, потрібно розташувати у функції в такому порядку, в якому в управляючому рядку розташовані для них специфікатори перетворення. Це пов'язано з роботою функції printf(). Функція виводить без змін всі символи управляючого рядка, за винятком специфікаторів перетворення. Коли функція знаходить в управляючому рядку перший специфікатор перетворення, вона підставляє значення другого параметра (argument1) на місце специфікатора, заздалегідь перетворивши це значення відповідно до даного специфікатора. Далі, знайшовши наступний специфікатор, функція підставляє на його місце третій параметр і так далі. Розглянемо приклади:

intnumPages = 273; printf("The book has %d pages.", numPages);виведе на екран The book has 273 pages. floatnQuantity = 100;printf("They have eaten only %f%% from %d kilograms of food\n", nQuantity/3, 25);виведе на екран They have eaten only 33.333333% from 25 kilograms of food.

У останньому прикладі цифри, виведені на екран, виглядають не дуже красиво. Для того, щоб виправити положення, що склалося, за допомогою функції printf(), необхідно розглянути як виглядає повністю прототип специфікатора перетворення. Насправді специфікатор перетворення -це не тільки знак відсотка з певною буквою. Специфікатор має декілька необов'язкових параметрів і виглядає він таким чином:

%[flags] [width] [.precision] [{h | l | L}]type

У даному прототипі type- це якраз ті букви, які ми розглянули раніше. До цього моменту ми використовували, так скажемо, спрощені специфікатори перетворення, тобто в нашому випадку прототип виглядав би так: %type

Що теж є правильним, правда, не завжди зручним. Щоб зрозуміти, навіщо потрібні специфікатору перетворення необов'язкові параметри, розглянемо їх по порядку. І почнемо наш розгляд з першого необов'язкового параметра - flags. Всі існуючі прапори приведені в таблиці. Відразу необхідно відзначити, що в специфікаторі можуть застосовуватися відразу декілька прапорів.

Прапор Значення  
- елемент із значенням вирівнювання по лівому краю; тобто вміст буде надрукований, починаючи з лівого краю
+ значення із знаком "плюс", якщо вони додатні, і із знаком "мінус", якщо вони від’ємні
Пропуск значення із знаком "плюс" друкуються з пропуском (але без знаку), якщо вони додатні, і із знаком "мінус", якщо вони від’ємні. Прапор "+" відміняє появу пропуску на початку
# використовує альтернативну форму для специфікації перетворення. Виводить на початку 0 для форми %о і 0x або 0X для форм %x і %X. Для всіх форм з плаваючою крапкою # гаран
для числових форм заповнює поле по ширині нулями замість пропусків. Цей прапор ігнорується, якщо є прапор "-" або якщо вказана точність для цілочисельної форми
         

 

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

intbooks = 10; printf("In my library %+d books\n", books);виведе на екран In my library +10 books intcount = 923; printf( "Decimal %d as:\n\tHex: %X hex: %x Octal: %o\n", count, count, count, count ); printf( "Decimal % d as:\n\tHex: %#X hex: %#x Octal: %#o\n", count, count, count, count );виведе на екран Decimal 923 as: Hex: 39B hex: 39b Octal: 1633 Decimal 923 as: Hex: 0X39B hex: 0x39b Octal: 01633

width - мінімальна ширина поля. Ширше поле використовуватиметься, якщо число, що виводиться, або рядок не відповідатиме полю.

Приклад:

intnum = 345; printf("'%d'\n", num); printf("'%2d'\n", num); printf("'%8d'\n", num); printf("'%-8d'\n", num);виведе на екран '345' '345' ' 345' '345 '

.precision - точність. Для перетворень %e, %E і %f задається кількість цифр, які будуть виведені праворуч від десяткового числа. Для перетворень %g і %G задається максимальне число значущих цифр. Для перетворення %s задається максимальне число символів, яке буде надруковано. Для перетворень цілого числа задається мінімальне число цифр, які повинні з'явитися; якщо ціле число містить менше цифр, чим задано, то в початок числа додаються нулі. При використанні крапки (.) розуміється наступний далі нуль, так що %.f - той же специфікатор, що і %.0f.

Приведемо приклад:

floatnQuantity = 100; printf("They have eaten only %.1f%% from %d kilograms of food\n" nQuantity/3, 25); printf("They have eaten only %03.f%% from %.4d kilograms of food\n" nQuantity/3, 25);виведе на екран They have eaten only 33.3% from 25 kilograms of food They have eaten only 033% from 0025 kilograms of food

Якщо замість числа в модифікаторі width поставити зірочку (*), то для даного специфікатора не буде задана фіксована ширина поля, а ширину регулюватиме змінна (ціле число). Те ж саме стосується точності - якщо замість числа в модифікаторі precision поставити *, то за кількість знаків після коми відповідатиме змінна. Приклад:

floatnum = 12.5; intwidth = 7; //відповідає за ширину поля int precision = 3;// відповідає за точність printf("%0*.*f", width, precision, num);виведе на екран 012.500

h | l | Lнеобов’язкові префікси, що приставляються до типу специфікатора модифікації. Вони уточнюють розмір параметра argument, що відноситься до даного специфікатора. hвикористовується при цілочисельному перетворенні для кодування значень short int або unsigned short int. lвикористовується при цілочисельному перетворенні для кодування значень long int або unsigned long int. Lвикористовується для перетворень з плаваючою крапкою для кодування значень long double.

Функція scanf()

Функція scanf() використовується для обробки інформації, введеної користувачем з клавіатури. Вона може перетворювати введену інформацію не тільки в символи, але і в числа, у тому числі і в числа з плаваючою крапкою.

Прототип функції scanf() на подив схожий на прототип попередньої функції, а саме printf(). Виглядає він таким чином:

int scanf(const char *control-str[, argument1 [, argument2 [, ... ]]]);

Повертає ця функція число елементів, які вона успішно прочитала. Якщо вона не прочитала ніяких елементів, функція повертає значення 0. Функція scanf() поверне значення EOF, якщо виявить символ кінця рядка або символ кінця файлу, а також у разі помилки.

Перший параметр функції - control-str - як і в попередній функції це управляючий рядок, супроводжується списком параметрів argument.

Після управляючого рядка йдуть параметри argument, кожний з яких є адресою змінної, в яку буде записано введене і лічене значення. Отже, якщо ми використовуємо функцію для читання рядка в символьний масив, як аргумент ми передаємо назву символьного масиву, в решті випадків, тобто для читання інших типів - ми передаємо назву змінної із знаком амперсанта (&).

Управляючий рядок указує, в які формати повинен бути перетворений текст, що вводиться. У ній також використовуються специфікатори перетворення, їх прототип схожий на прототип специфікатора функції printf, але все таки відрізняється. От як виглядає прототип специфікатора перетворення функції scanf():

% [*] [width] [{h | l | L}] type

Розглянемо типи (type) специфікаторів перетворення для даної функції. Вони ідентичні специфікаторам функції printf.

Специфікатор перетворення Значення  
%c Інтерпретує введення як символ
%d, %i Інтерпретує введення як десяткове ціле число із знаком
%e, %f, %g %E, %G Інтерпретує введення як число з плаваючою крапкою (float)
%o Інтерпретує введення як вісімкове ціле число із знаком
%p Інтерпретує введення як покажчик (адреса)
%s Інтерпретує введення як рядок; прочитує введене значення з першого символу, що не є службовим, і включає всі символи до наступного службового символу.
%u Інтерпретує введення як десяткове ціле число без знаку
%x, %X Інтерпретує введення як шістнадцяткове ціле число із знаком
               

Для того, щоб відокремити значення, що вводяться, функція scanf() використовує символи, звані службовими. До них відносяться символи переносу рядка, табуляції і пропуски. Що це означає: під час введення інформації користувач повинен після кожного введеного значення вводити службовий символ для того, щоб показати функції, що він закінчив введення чергового значення. Єдине виключення - специфікатор %c, який читає кожен наступний символ, навіть якщо цей символ є службовим. Приведемо приклад:

charname[15]; intage; floatsalary; printf("Input your name, age and your salary\n"); scanf("%s %d %f", name &age, &salary); printf("Name is %s\n Age is %d\n Salary is %6.2f\n", name, age, salary);коли на екрані з'являється рядок Input your name, age and your salaryми вводимо Bill 35 521.55після цього на екрані повинен з'явитися рядок Name is Bill Age is 35 Salary is 521.55

Модифікатор * примушує функцію scanf() ігнорувати відповідне введення. Тобто, якщо в специфікаторі перетворення стоїть зірочка, то функція введене значення не записує в змінну. Приклад:

intnum; printf("Input 3 numbers:\n"); scanf("%*d %d %*d", &num); printf("Second number is %d\n",num);коли на екрані з'явиться рядок Input 3 numbers:ми вводимо 44 55 66внаслідок чого на екрані повинен з'явитися рядок Second number is 55

Другий необов'язковий модифікатор специфікатора - width - максимальна ширина поля. Введення зупиняється, коли досягнута максимальна ширина поля або при виявленні службового символу. Після досягнення максимальної ширини поля функція вважає, що почалося введення наступного значення.

Використання необов'язкових префіксів h | l | L розглянуте в таблиці:

Використання префікса з типом специфікатора визначає тип  
l d, i, про, x або X long
l u unsigned long
l e, f, g, E або G double
h d, i, про, x, або X short int
h u unsigned short int
L e, f, g, E або G long double
         

Як Ви вже відмітили, в контрольному рядку функції scanf() між специфікаторами перетворення в прикладах використовувалися пропуски. Пропуск в контрольному рядку означає, що потрібно пропускати будь-який службовий символ перед наступним одержуваним елементом. Оскільки практично всі специфікатори, за виключенням %с, автоматично пропускають службові символи, то :

intn; floatm;рядок коду scanf("%d%f" &n, &m);ідентичний scanf(" %d %f", &n &m);

Якщо ж використовується специфікатор перетворення %с, то без пропуску перед цим специфікатором функція рахує будь-який перший символ, у тому числі і службовий. Але якщо ж перед специфікатором %с коштує пропуск, то функція рахує перший неслужбовий символ.

У контрольному рядку можна також використовувати звичайні символи, відмінні від пропуску. Наприклад

scanf("%d + %f", &n, &m);

В даному прикладі функція чекатиме від користувача, що він введе між двома значеннями знак +. Якщо ж не ввести з клавіатури символ +, то в подальші елементи не будуть занесені значення.


Поделиться:

Дата добавления: 2014-12-03; просмотров: 384; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.006 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты