Vstavané knižničné funkcie pre vstup užívateľa | sscanf, scanf_s, fscanf_s, sscanf_s

Programovací jazyk C poskytuje rôzne funkcie vstavanej knižnice pre vstup používateľa. V tomto článku sa dozvieme o funkciách knižnice sscanf scanf_s fscanf_s sscanf_s v jazyku C.

1. Funkcia sscanf() v jazyku C

sscanf() sa používa na čítanie formátovaného vstupu z reťazca. Funkcie scanf() aj sscanf() sú podobné, jediný rozdiel medzi nimi je ten, že funkcia scanf() číta vstup od používateľa zo štandardného vstupu, akým je klávesnica a funkcia sscanf() číta vstup z reťazca a ukladá vstup do iného reťazca.

Syntax

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

Parametre

    str : Vstupný reťazec, z ktorého chceme čítať dáta. formát : Reťazec, ktorý obsahuje špecifikátor(y) typu. … (elipsa) : Označuje, že funkcia prijíma premenlivý počet argumentov.

Návratová hodnota

  • V prípade úspechu funkcia vráti počet úspešne prečítaných hodnôt.
  • V prípade zlyhania vstupu pred tým, ako je možné úspešne prečítať akékoľvek údaje, sa vráti EOF.

Poznámka : Týchto argumentov by malo byť aspoň toľko, koľko hodnôt je uložených v špecifikátoroch formátu.

Príklad: C Program na ilustráciu funkcie 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  ;   }   

Výstup
3 blue balls  

2. Funkcia scanf_s() v jazyku C

Táto funkcia je špecifická pre kompilátory spoločnosti Microsoft. Je to rovnaké ako scanf okrem toho, že nespôsobuje preťaženie vyrovnávacej pamäte. Funkcia scanf_s() je bezpečnejšia ako funkcia scanf(), pretože poskytuje dodatočný parameter na určenie veľkosti vyrovnávacej pamäte, ktorá môže zabrániť pretečeniu vyrovnávacej pamäte.

Syntax

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

Parametre

    prúd : Ukazovateľ na objekt File, ktorý identifikuje stream. formát : Je to reťazec, ktorý obsahuje špecifikátor(y) typu. … (elipsa) : Označuje, že funkcia prijíma premenlivý počet argumentov.

Poznámka : Tu môžeme špecifikovať veľkosť vyrovnávacej pamäte a vlastne kontrolovať limit vstupu, aby celá aplikácia nespadla kvôli pretečeniu pamäte.

Návratová hodnota

  • V prípade úspechu funkcia vráti počet načítaných hodnôt.
  • V prípade zlyhania vstupu pred tým, ako sa dáta podarilo úspešne prečítať, sa vráti EOF.

Prečo používať scanf_s()?

scanf len prečíta akýkoľvek vstup poskytnutý z konzoly. C nekontroluje, či sa vstup používateľa zmestí do premennej, ktorú ste určili. Ak máte pole s názvom color[3] a použijete scanf pre reťazec Red, bude to fungovať dobre, ale ak používateľ zadá viac ako 3 znaky, scanf začne zapisovať do pamäte, ktorá nepatrí do farebného poľa.

C to nezachytí ani vás neupozorní a môže alebo nemusí zlyhať program v závislosti od toho, či sa niečo pokúsi o prístup a zápis do tohto pamäťového slotu, ktorý nepatrí do farebného poľa. Tu vstupuje do hry scanf_s. scanf_s skontroluje, či sa vstup používateľa zmestí do daného pamäťového priestoru.

Poznámka : scanf_s() bude fungovať iba v Microsoft Visual Studio.

Príklad 1: C Program na ilustráciu funkcie 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  ;   }   


Vstup 1

Red 

Výstup 1

Red 

Vstup 2

Yellow 

Výstup 2

No Output 

Príklad 2: C Program na ilustráciu vzťahu medzi veľkosťou vyrovnávacej pamäte a veľkosťou poľa.

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  ;   }   
  • Ak je veľkosť vyrovnávacej pamäte rovnaká alebo menšia ako veľkosť poľa, potom zadanie väčšie alebo rovné veľkosti vyrovnávacej pamäte povedie k strate údajov, pretože nadbytočné údaje budú skrátené a budú sa čítať údaje do veľkosti vyrovnávacej pamäte - 1.
  • Ak je veľkosť vyrovnávacej pamäte väčšia ako veľkosť poľa, potom
    • zadanie menšej ako veľkosť vyrovnávacej pamäte bude fungovať, ale zobrazí chybu
    • zadanie väčšie ako veľkosť vyrovnávacej pamäte povedie k pretečeniu vyrovnávacej pamäte a spôsobí rovnakú chybu.

3. Funkcia fscanf_s() v jazyku C

Rozdiel medzi fscanf() a fscanf_s() je rovnaký ako medzi scanf() a scanf_s(). fscanf_s() je bezpečná funkcia, ktorá vyžaduje, aby veľkosť každého poľa typu c Cs S a [ ] bola odovzdaná ako argument bezprostredne za premennou.

Syntax

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

Parametre

    str : reťazec používaný na získanie údajov formát : reťazec, ktorý obsahuje špecifikátor(y) typu … (elipsa) : Označuje, že funkcia prijíma premenlivý počet argumentov.

Poznámka : fscanf_s má ďalší parameter na špecifikáciu veľkosti vyrovnávacej pamäte a skutočne kontroluje limit vstupu.

Návratová hodnota

  • V prípade úspechu funkcia vráti počet úspešne prečítaných hodnôt.
  • V prípade zlyhania vstupu pred tým, ako sa dáta podarilo úspešne prečítať, sa vráti EOF.

Poznámka : fscanf_s bude fungovať iba v MS Visual Studio.

Príklad: C Program na ilustráciu funkcie 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  );   }   


Výstup

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

4. Funkcia sscanf_s() v jazyku C

sscanf_s() je bezpečná funkcia sscanf() a bezpečné funkcie vyžadujú, aby veľkosť každého poľa typu c C s S a [ bola odovzdaná ako argument bezprostredne za premennou.

Syntax

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

Parametre

    str : reťazec používaný na získanie údajov formát : reťazec, ktorý obsahuje špecifikátor(y) typu … (elipsa) : Označuje, že funkcia prijíma premenlivý počet argumentov.

Poznámka : sscanf_s má ďalší parameter na špecifikáciu veľkosti vyrovnávacej pamäte a skutočne kontroluje limit vstupu.

Návratová hodnota

  • V prípade úspechu funkcia vráti počet úspešne prečítaných hodnôt.
  • V prípade zlyhania vstupu pred tým, ako sa dáta podarilo úspešne prečítať, sa vráti EOF.

Poznámka : sscanf_s() bude fungovať iba v Microsoft Visual Studio.

Príklad: C Program na ilustráciu funkcie 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  ;   }   


Výstup

3 blue balls 

Vytvoriť kvíz