Vgrajene knjižnične funkcije za uporabniški vnos | sscanf, scanf_s, fscanf_s, sscanf_s

Programski jezik C ponuja različne vgrajene knjižnične funkcije za uporabniški vnos. V tem članku bomo spoznali funkcije knjižnice sscanf scanf_s fscanf_s sscanf_s v C.

1. Funkcija sscanf() v C

sscanf() se uporablja za branje oblikovanega vnosa iz niza. Obe funkciji scanf() in sscanf() sta podobni, edina razlika med njima je, da funkcija scanf() bere vnos uporabnika iz standardnega vnosa, kot je tipkovnica, funkcija sscanf() pa bere vnos iz niza in shrani vnos v drug niz.

Sintaksa

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

Parametri

    str : Vnosni niz, iz katerega želimo prebrati podatke. format : Niz, ki vsebuje specifikator(e) vrste. … (elipsa)

Povratna vrednost

  • Ob uspehu funkcija vrne število uspešno prebranih vrednosti.
  • V primeru neuspešnega vnosa, preden je mogoče kateri koli podatek uspešno prebrati, se vrne EOF.

Opomba : teh argumentov mora biti vsaj toliko, kot je število vrednosti, ki jih shranijo specifikatorji formata.

Primer: program C za ponazoritev funkcije 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  ;   }   

Izhod
3 blue balls  

2. funkcija scanf_s() v C

Ta funkcija je specifična za Microsoftove prevajalnike. Je enak scanf, le da ne povzroči preobremenitve medpomnilnika. Funkcija scanf_s() je varnejša od funkcije scanf(), saj zagotavlja dodaten parameter za določanje velikosti medpomnilnika, s katerim se lahko izognete prepolnitvi medpomnilnika.

Sintaksa

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

Parametri

    tok : Kazalec na predmet File, ki identificira tok. format : To je niz, ki vsebuje specifikator(e) vrste. … (elipsa) : Označuje, da funkcija sprejema spremenljivo število argumentov.

Opomba : Tukaj lahko določimo velikost medpomnilnika in dejansko nadziramo omejitev vnosa, tako da se celotna aplikacija ne zruši zaradi prepolnitve pomnilnika.

Povratna vrednost

  • Ob uspehu funkcija vrne število prebranih vrednosti.
  • V primeru neuspešnega vnosa, preden je bilo mogoče uspešno prebrati podatke, se vrne EOF.

Zakaj uporabljati scanf_s()?

scanf samo prebere kateri koli vnos, ki je na voljo s konzole. C ne preveri, ali bo uporabniški vnos ustrezal spremenljivki, ki ste jo določili. Če imate matriko z imenom color[3] in uporabite scanf za niz Red, bo delovalo dobro, če pa uporabnik vnese več kot 3 znake, začne scanf pisati v pomnilnik, ki ne pripada barvni matriki.

C tega ne bo ujel ali vas opozoril in morda bo zrušil program ali pa tudi ne, odvisno od tega, ali poskuša nekaj dostopati in pisati v to pomnilniško režo, ki ne pripada barvnemu nizu. Tukaj nastopi scanf_s. scanf_s preveri, ali bo uporabniški vnos ustrezal danemu pomnilniškemu prostoru.

Opomba : scanf_s() bo deloval samo v Microsoft Visual Studio.

Primer 1: Program C za ponazoritev funkcije 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  ;   }   


Vnos 1

Red 

Izhod 1

Red 

Vnos 2

Yellow 

No Output 

Primer 2: Program C za ponazoritev razmerja med velikostjo medpomnilnika in velikostjo polja.

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  ;   }   
  • Če je velikost medpomnilnika večja od velikosti matrike, potem
    • vnos, manjši od velikosti vmesnega pomnilnika, bo deloval, vendar bo povzročil napako
    • vnos, ki je večji od velikosti vmesnega pomnilnika, bo povzročil prepolnitev medpomnilnika in povzročil enako napako.

3. Funkcija fscanf_s() v C

Razlika med fscanf() in fscanf_s() je enaka kot pri scanf() in scanf_s(). fscanf_s() je varna funkcija, ki zahteva, da se velikost vsakega polja tipa c C s S in [] posreduje kot argument takoj za spremenljivko.

Sintaksa

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

Parametri

    str : niz, ki se uporablja za pridobivanje podatkov format : niz, ki vsebuje specifikatorje vrste … (elipsa) : Označuje, da funkcija sprejema spremenljivo število argumentov.

Opomba : fscanf_s ima dodaten parameter za določanje velikosti vmesnega pomnilnika in dejansko nadzor nad omejitvijo vnosa.

Povratna vrednost

  • Ob uspehu funkcija vrne število uspešno prebranih vrednosti.
  • V primeru neuspešnega vnosa, preden je bilo mogoče uspešno prebrati podatke, se vrne EOF.

Opomba : fscanf_s bo deloval samo v MS Visual studiu.

Primer: program C za ponazoritev funkcije 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  );   }   


Izhod

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

4. Funkcija sscanf_s() v C

sscanf_s() je varna funkcija sscanf() in varne funkcije zahtevajo, da se velikost vsakega polja tipa c C s S in [ posreduje kot argument takoj za spremenljivko.

Sintaksa

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

Parametri

    str : niz, ki se uporablja za pridobivanje podatkov format : niz, ki vsebuje specifikatorje vrste … (elipsa) : Označuje, da funkcija sprejema spremenljivo število argumentov.

Opomba : sscanf_s ima dodaten parameter za določanje velikosti vmesnega pomnilnika in dejansko nadzor nad omejitvijo vnosa.

Povratna vrednost

  • Ob uspehu funkcija vrne število uspešno prebranih vrednosti.
  • V primeru neuspešnega vnosa, preden je bilo mogoče uspešno prebrati podatke, se vrne EOF.

Opomba : sscanf_s() bo deloval le v Microsoft Visual Studio.

Primer: program C za ponazoritev funkcije 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  ;   }   


Izhod

3 blue balls 

Ustvari kviz