У мові C, scanf() функція використовується для читання форматованого введення зі стандартного вводу. Він повертає всю кількість символів, записаних у ньому, інакше повертає від’ємне значення.
Синтаксис:
int scanf(const char *characters_set)>
Часова складність: O(n)
Допоміжний простір: O(n), де n – довжина вхідних даних.
Багато з нас знають традиційне використання scanf. Що ж, ось деякі з маловідомих фактів
Шрея Гошал
Як прочитати лише ту частину введення, яка нам потрібна?
Наприклад, розглянемо деякий вхідний потік, який містить лише символи, за якими йде ціле число або число з плаваючою точкою. І нам потрібно сканувати лише це ціле чи число з плаваючою точкою.
приклад:
Input : 'this is the value 100', Output : value read is 100 Input : 'this is the value 21.2', Output : value read is 21.2>C
// C program to demonstrate that // we can ignore some string // in scanf() #include int main() { int a; scanf('This is the value %d', &a); printf('Input value read : a = %d', a); return 0; } // Input : This is the value 100>
Тепер припустімо, що ми не знаємо, що таке попередні символи, але точно знаємо, що останнє значення є цілим числом. Як ми можемо сканувати останнє значення як ціле?
Наведене нижче рішення працює, лише якщо рядок введення не містить пробілів. Наприклад,
Введення
'blablabla 25'>C
// C program to demonstrate use of *s #include int main() { int a; scanf('%*s %d', &a); printf('Input value read : a=%d', a); return 0; }> Вихід
Input Value read : 25>
Пояснення : %*s у scanf використовується для ігнорування деяких введених даних за потреби. У цьому випадку він ігнорує введення до наступного пробілу або нового рядка. Подібним чином, якщо ви напишете %*d, цілі числа ігноруватимуться до наступного пробілу або нового рядка.
Загальне використання scanf():
C // C program to demonstrate general use of scanf() #include int main() { int a; scanf('%d', &a); printf('a = %d', a); return 0; }> Введення
2>
Вихід
a = 2>
На перший погляд наведений вище факт може здатися не корисним прийомом. Щоб зрозуміти його використання, давайте спочатку розглянемо fscanf().
Функція fscanf у C
Втомилися від незграбного синтаксису для читання з файлів? добре, fscanf приходить на допомогу. Ця функція використовується для читання відформатованого введення з заданого потоку мовою C.
Синтаксис:
int fscanf(FILE *ptr, const char *format, ...)>
fscanf читає з файлу, на який вказує покажчик FILE (ptr), замість читання з вхідного потоку.
Повернене значення: У разі невдачі повертає нуль або EOF. В іншому випадку він повертає кількість успішно призначених елементів.
Часова складність: O(n)
Допоміжний простір: O(n), де n – довжина вхідних даних.
приклад 1: Розглянемо наступний текстовий файл abc.txt
NAME AGE CITY abc 12 hyderabad bef 25 delhi cce 65 bangalore>
Тепер ми хочемо прочитати лише поле міста з текстового файлу вище, ігноруючи всі інші поля. Поєднання fscanf і згаданого вище трюку робить це з легкістю
який розмір екрана мого комп'ютераC
// C Program to demonstrate fscanf #include // Driver Code int main() { FILE* ptr = fopen('abc.txt', 'r'); if (ptr == NULL) { printf('no such file.'); return 0; } /* Assuming that abc.txt has content in below format NAME AGE CITY abc 12 hyderabad bef 25 delhi cce 65 bangalore */ char buf[100]; while (fscanf(ptr, '%*s %*s %s ', buf) == 1) printf('%s
', buf); return 0; }> Вихід
CITY hyderabad delhi bangalore>
приклад 2: Розглянемо наступний бінарний файл program.bin
n1 n2 n3 1 5 6 2 10 11 3 15 16 4 20 21>
Щоб прочитати всі значення n1, n2 і n3 у контейнері, ми використовуємо fscanf()
C #include #include struct threeNum{ int n1, n2, n3; }; int main(){ int n; struct threeNum num; FILE *fptr; if ((fptr = fopen('program.bin','rb')) == NULL){ printf('Error! opening file'); // Program exits if the file pointer returns NULL. exit(1); } for(n = 1; n < 5; ++n){ fread(&num, sizeof(struct threeNum), 1, fptr); printf('n1: %d n2: %d n3: %d', num.n1, num.n2, num.n3); } fclose(fptr); return 0; } //Code submitted by Susobhan Akhuli> Вихід
n1: 1 n2: 5 n3: 6 n1: 2 n2: 10 n3: 11 n1: 3 n2: 15 n3: 16 n1: 4 n2: 20 n3: 21>
Розглянемо відмінності у вигляді таблиці -:
| scanf() | fscanf() | |
| 1. | Він використовується для читання стандартного введення. | Ця функція використовується для читання вхідних даних із файлу |
| 2. | Його синтаксис -: scanf(const char *format, …) | Його синтаксис -: fscanf(ФАЙЛ *потік, const char *формат, …) |
| 3. | Він вимагає специфікаторів формату, щоб приймати вхідні дані певного типу. | Він читає потік у вигляді байта |
| 4. | Для цього потрібні три параметри: Пробільний символ , непробільний символ, специфікатори формату як центрувати зображення на css | Він визначений у файлі заголовків #include |