Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект_студ1.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
499.2 Кб
Скачать

Функція 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, який читає кожен наступний символ, навіть якщо цей символ є службовим. Приведемо приклад:

char name[15];

int age;

float salary;

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() ігнорувати відповідне введення. Тобто, якщо в специфікаторі перетворення стоїть зірочка, то функція введене значення не записує в змінну. Приклад:

int num;

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() між специфікаторами перетворення в прикладах використовувалися пропуски. Пропуск в контрольному рядку означає, що потрібно пропускати будь-який службовий символ перед наступним одержуваним елементом. Оскільки практично всі специфікатори, за виключенням %с, автоматично пропускають службові символи, то :

int n;

float m;

рядок коду

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

ідентичний

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

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

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

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

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

Оператори розгалуження. Оператор безумовного переходу goto.

Умовний оператор IF.