Ugrađene funkcije knjižnice za korisnički unos | sscanf, scanf_s, fscanf_s, sscanf_s

Programski jezik C nudi razne ugrađene bibliotečke funkcije za korisnički unos. U ovom ćemo članku naučiti o funkcijama knjižnice sscanf scanf_s fscanf_s sscanf_s u C-u.

1. sscanf() funkcija u C-u

sscanf() se koristi za čitanje formatiranog unosa iz niza. Obje funkcije scanf() i sscanf() su slične, jedina razlika između njih je u tome što funkcija scanf() čita unos korisnika sa standardnog unosa poput tipkovnice, a funkcija sscanf() čita unos iz niza i pohranjuje unos u drugi niz.

Sintaksa

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

Parametri

    str : Ulazni string iz kojeg želimo očitati podatke. format : Niz koji sadrži specifikator(e) tipa. … (elipsa) : Označava da funkcija prihvaća promjenjivi broj argumenata.

Povratna vrijednost

  • Nakon uspjeha funkcija vraća broj uspješno pročitanih vrijednosti.
  • U slučaju neuspješnog unosa prije nego što se podaci mogu uspješno pročitati, vraća se EOF.

Bilješka : Trebalo bi biti najmanje onoliko ovih argumenata koliko je vrijednosti pohranjeno specifikatorima formata.

Primjer: C program za ilustraciju sscanf funkcije

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  ;   }   

Izlaz
3 blue balls  

2. scanf_s() funkcija u C-u

Ova je funkcija specifična za Microsoftove prevoditelje. Isti je kao scanf osim što ne uzrokuje preopterećenje međuspremnika. scanf_s() funkcija je sigurnija od scanf() funkcije jer pruža dodatni parametar za određivanje veličine međuspremnika koji može izbjeći prekoračenje međuspremnika.

Sintaksa

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

Parametri

    potok : Pokazivač na File objekt koji identificira stream. format : To je niz koji sadrži specifikator(e) tipa. … (elipsa) : Označava da funkcija prihvaća promjenjivi broj argumenata.

Bilješka : Ovdje možemo odrediti veličinu međuspremnika i zapravo kontrolirati ograničenje unosa tako da se cijela aplikacija ne sruši zbog prelivanja memorije.

Povratna vrijednost

  • Nakon uspjeha funkcija vraća broj pročitanih vrijednosti.
  • U slučaju neuspješnog unosa prije nego što se podaci mogu uspješno pročitati, vraća se EOF.

Zašto koristiti scanf_s()?

scanf samo čita sve što je uneseno s konzole. C ne provjerava hoće li korisnički unos stati u varijablu koju ste odredili. Ako imate niz koji se zove color[3] i koristite scanf za niz Red, to će dobro funkcionirati, ali ako korisnik unese više od 3 znaka, scanf počinje pisati u memoriju koja ne pripada nizu boja.

C to neće uhvatiti niti vas upozoriti i može ili ne mora srušiti program ovisno o tome hoće li nešto pokušati pristupiti i pisati na tom memorijskom utoru koji ne pripada nizu boja. Ovdje scanf_s stupa na scenu. scanf_s provjerava hoće li korisnički unos stati u dani memorijski prostor.

Bilješka : scanf_s() će raditi samo u Microsoft Visual Studio.

Primjer 1: C program za ilustraciju 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  ;   }   


Unos 1

Red 

Izlaz 1

Red 

Unos 2

Yellow 

Izlaz 2

No Output 

Primjer 2: C program za ilustraciju odnosa između veličine međuspremnika i veličine 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  ;   }   
  • Ako je veličina međuspremnika jednaka ili manja od veličine niza, tada će unos veći od ili jednak veličini međuspremnika dovesti do gubitka podataka jer će višak podataka biti skraćen, a podaci do veličine međuspremnika - 1 bit će pročitani.
  • Ako je veličina međuspremnika veća od veličine niza tada
    • unos manji od veličine međuspremnika će uspjeti, ali će dati pogrešku
    • unos veći od veličine međuspremnika dovest će do prekoračenja međuspremnika i dati istu pogrešku.

3. Funkcija fscanf_s() u C-u

Razlika između fscanf() i fscanf_s() ista je kao razlika između scanf() i scanf_s(). fscanf_s() je sigurna funkcija koja zahtijeva da veličina svakog polja tipa c C s S i [] bude proslijeđena kao argument neposredno nakon varijable.

Sintaksa

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

Parametri

    str : niz koji se koristi za dohvaćanje podataka format : niz koji sadrži specifikator(e) tipa … (elipsa) : Označava da funkcija prihvaća promjenjivi broj argumenata.

Bilješka : fscanf_s ima dodatni parametar za određivanje veličine međuspremnika i zapravo kontrolu ograničenja unosa.

Povratna vrijednost

  • Nakon uspjeha funkcija vraća broj uspješno pročitanih vrijednosti.
  • U slučaju neuspješnog unosa prije nego što se podaci mogu uspješno pročitati, vraća se EOF.

Bilješka : fscanf_s će raditi samo u MS Visual studiju.

Primjer: C program za ilustraciju 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  );   }   


Izlaz

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

4. sscanf_s() funkcija u C-u

sscanf_s() je sigurna funkcija sscanf() i sigurne funkcije zahtijevaju da veličina svakog c C s S i [ tipa polja bude proslijeđena kao argument odmah nakon varijable.

Sintaksa

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

Parametri

    str : niz koji se koristi za dohvaćanje podataka format : niz koji sadrži specifikator(e) tipa … (elipsa) : Označava da funkcija prihvaća promjenjivi broj argumenata.

Bilješka : sscanf_s ima dodatni parametar za određivanje veličine međuspremnika i zapravo kontrolu ograničenja unosa.

Povratna vrijednost

  • Nakon uspjeha funkcija vraća broj uspješno pročitanih vrijednosti.
  • U slučaju neuspješnog unosa prije nego što se podaci mogu uspješno pročitati, vraća se EOF.

Bilješka : sscanf_s() će raditi samo u Microsoft Visual Studio.

Primjer: C program za ilustraciju 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  ;   }   


Izlaz

3 blue balls 

Napravi kviz