Вбудовані бібліотечні функції для введення користувача | sscanf, scanf_s, fscanf_s, sscanf_s

Мова програмування C надає різні вбудовані бібліотечні функції для введення користувачами. У цій статті ми дізнаємося про бібліотечні функції sscanf scanf_s fscanf_s sscanf_s у C.

1. Функція sscanf() у C

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

Синтаксис

int   sscanf   ( const char *   str   const char *   format   ...); 

Параметри

    вул : Вхідний рядок, з якого ми хочемо прочитати дані. формат : Рядок, який містить специфікатор(и) типу. … (крапка) : вказує на те, що функція приймає змінну кількість аргументів.

Повернене значення

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

Примітка : цих аргументів має бути принаймні стільки, скільки значень зберігають специфікатори формату.

Приклад: програма на C для ілюстрації функції sscanf

C
   // C program to illustrate sscanf statement   #include         int     main  ()   {      // declaring array s      char     s  []     =     '3 red balls 2 blue balls'  ;      char     str  [  10  ]     str2  [  10  ];      int     i  ;      // %*s is used to skip a word      sscanf  (  s       '%d %*s %*s %*s %s %s'       &  i       str       str2  );      printf  (  '%d %s %s   n  '       i       str       str2  );      return     0  ;   }   

Вихід
3 blue balls  

2. Функція scanf_s() у C

Ця функція є специфічною для компіляторів Microsoft. Це те саме, що і scanf, за винятком того, що він не викликає перевантаження буфера. Функція scanf_s() є більш безпечною, ніж функція scanf(), оскільки вона надає додатковий параметр для визначення розміру буфера, який може уникнути переповнення буфера.

Синтаксис

int   scanf_s  (const char *format [argument]...); 

Параметри

    потік : вказівник на об’єкт File, який ідентифікує потік. формат : це рядок, який містить специфікатор(и) типу. … (крапка) : вказує на те, що функція приймає змінну кількість аргументів.

Примітка : Тут ми можемо вказати розмір буфера та фактично контролювати обмеження введення, щоб уся програма не аварійно завершувала роботу через переповнення пам’яті.

Повернене значення

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

Навіщо використовувати scanf_s()?

scanf просто читає будь-який вхід, наданий з консолі. C не перевіряє, чи введені користувачем дані вміщаються в змінну, яку ви призначили. Якщо у вас є масив під назвою color[3] і ви використовуєте scanf для рядка Red, він працюватиме добре, але якщо користувач вводить більше 3 символів, scanf починає записувати в пам’ять, яка не належить до масиву кольорів.

C не вловить це чи не попередить вас, і він може призвести до збою програми залежно від того, чи спробує щось отримати доступ і записати в цей слот пам’яті, який не належить до масиву кольорів. Ось де в гру вступає scanf_s. scanf_s перевіряє, чи введені користувачем дані вміщуються в заданий простір пам’яті.

Примітка : scanf_s() працюватиме лише в Microsoft Visual Studio.

Приклад 1: програма на C для ілюстрації функції sscanf_s

C
   // C program to illustrate sscanf_s statement   // scanf_s() will only work in Microsoft Visual Studio.   #include         #include         int     main  ()   {      char     a  [  5  ];      // sizeof(a) is buffer size      scanf_s  (  '%s'       a       sizeof  (  a  ));      printf  (  '  n  %s '       a  );      return     0  ;   }   


Вхід 1

Red 

Вихід 1

Red 

Вхід 2

Yellow 

Вихід 2

No Output 

Приклад 2: Програма на C для ілюстрації співвідношення між розміром буфера та розміром масиву.

C++
   // C++ program   // consumes the Enter key   // (newline character) pressed after input   #include         int     main  ()   {      // example      char     ch  [  100000  ];      printf  (  'Enter characters: '  );      scanf_s  (  '%s'       ch       99999  );      getchar  ();      return     0  ;   }   
C
   // C program   // consumes the Enter key   // (newline character) pressed after input   #include         int     main  ()   {      char     ch  [  100000  ];      printf  (  'Enter characters: '  );      scanf_s  (  '%s'       ch       99999  );      getchar  ();      return     0  ;   }   
  • Якщо розмір буфера дорівнює або менше розміру масиву, тоді введення, що перевищує або дорівнює розміру буфера, призведе до втрати даних, оскільки надлишок даних буде скорочено, а дані до розміру буфера - 1 будуть зчитані.
  • Якщо розмір буфера більший за розмір масиву, тоді
    • введення, менше розміру буфера, спрацює, але дасть помилку
    • введення, що перевищує розмір буфера, призведе до переповнення буфера та дасть ту саму помилку.

3. Функція fscanf_s() у C

Різниця між fscanf() і fscanf_s() така ж, як і scanf() і scanf_s(). fscanf_s() є безпечною функцією, яка вимагає, щоб розмір кожного поля типу c C s S і [] передавався як аргумент безпосередньо після змінної.

Синтаксис

int fscanf_s( FILE *stream const char *format [argument ]... ); 

Параметри

    вул : рядок, який використовується для отримання даних формат : рядок, який містить специфікатор(и) типу … (крапка) : вказує на те, що функція приймає змінну кількість аргументів.

Примітка : fscanf_s має додатковий параметр для визначення розміру буфера та фактичного контролю обмеження введення.

Повернене значення

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

Примітка : fscanf_s буде працювати тільки в MS Visual Studio.

Приклад: програма на C для ілюстрації функції fscanf_s

C
   // C program to illustrate fscanf_s statement   // This program will run on MS Visual studio   #include         #include         int     main  ()   {      char     s1  [  10  ]     s2  [  10  ]     s3  [  10  ];      int     year  ;      // file pointer      FILE  *     fp  ;      // Open file securely      fopen_s  (  &  fp       'file.txt'       'w+'  );      fputs  (  'Hello World its 2017'       fp  );      rewind  (  fp  );      // Using fscanf_s      fscanf_s  (  fp       '%s'       s1       sizeof  (  s1  ));      fscanf_s  (  fp       '%s'       s2       sizeof  (  s2  ));      fscanf_s  (  fp       '%s'       s3       sizeof  (  s3  ));      fscanf_s  (  fp       '%d'       &  year       sizeof  (  year  ));      printf  (  'String1 |%s|  n  '       s1  );      printf  (  'String2 |%s|  n  '       s2  );      printf  (  'String3 |%s|  n  '       s3  );      printf  (  'Integer |%d|  n  '       year  );      fclose  (  fp  );      return     (  0  );   }   


Вихід

String1 |Hello| String2 |World| String3 |its| Integer |2017| 

4. Функція sscanf_s() у C

sscanf_s() є захищеною функцією sscanf(), і безпечні функції вимагають, щоб розмір кожного поля c C s S і [ type передавався як аргумент безпосередньо після змінної.

Синтаксис

int   sscanf_s  (const char *  restrict buffer   const char *  restrict format   ...); 

Параметри

    вул : рядок, який використовується для отримання даних формат : рядок, який містить специфікатор(и) типу … (крапка) : вказує на те, що функція приймає змінну кількість аргументів.

Примітка : sscanf_s має додатковий параметр для визначення розміру буфера та фактичного контролю обмеження введення.

Повернене значення

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

Примітка : sscanf_s() працюватиме лише в Microsoft Visual Studio.

Приклад: програма на C для ілюстрації функції sscanf_s

C
   // C program to illustrate sscanf_s statement   // This program will run on MS Visual studio   #include         int     main  ()   {      char     s  []     =     '3 red balls 2 blue balls'  ;      char     str  [  10  ]     str2  [  10  ];      int     i  ;      // %*s is used to skip a word      sscanf_s  (  s       '%d'       &  i       sizeof  (  i  ));      sscanf_s  (  s       '%*d %*s %*s %*s %s'       str       sizeof  (  str  ));      sscanf_s  (  s       '%*d %*s %*s %*s %*s %s'       str2        sizeof  (  str2  ));      printf  (  '%d %s %s   n  '       i       str       str2  );      return     0  ;   }   


Вихід

3 blue balls 

Створіть вікторину