Ingebouwde bibliotheekfuncties voor gebruikersinvoer | sscanf, scanf_s, fscanf_s, sscanf_s

De programmeertaal C biedt verschillende ingebouwde bibliotheekfuncties voor gebruikersinvoer. In dit artikel leren we over sscanf scanf_s fscanf_s sscanf_s bibliotheekfuncties in C.

1. sscanf() Functie in C

sscanf() wordt gebruikt om geformatteerde invoer van de string te lezen. Zowel de functies scanf() als sscanf() zijn vergelijkbaar. Het enige verschil tussen beide is dat de functie scanf() de invoer van de gebruiker leest via standaardinvoer zoals een toetsenbord, en de functie sscanf() de invoer van een string leest en de invoer in een andere string opslaat.

Syntaxis

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

Parameters

    str : Invoerreeks waaruit we gegevens willen lezen. formaat : Een tekenreeks die de typespecificatie(s) bevat. … (ellips) : Het geeft aan dat de functie een variabel aantal argumenten accepteert.

Retourwaarde

  • Bij succes retourneert de functie het aantal succesvol gelezen waarden.
  • In het geval van een invoerfout voordat gegevens met succes kunnen worden gelezen, wordt EOF geretourneerd.

Opmerking : Er moeten minstens evenveel van deze argumenten zijn als het aantal waarden dat is opgeslagen door de formaatspecificaties.

Voorbeeld: C-programma om de sscanf-functie te illustreren

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

Uitvoer
3 blue balls  

2. scanf_s() Functie in C

Deze functie is specifiek voor Microsoft-compilers. Het is hetzelfde als scanf, behalve dat het geen bufferoverbelasting veroorzaakt. De functie scanf_s() is veiliger dan de functie scanf() omdat deze een extra parameter biedt om de buffergrootte op te geven die bufferoverloop kan voorkomen.

Syntaxis

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

Parameters

    stroom : aanwijzer naar het File-object dat de stream identificeert. formaat : Het is een string die de typespecificatie(s) bevat. … (ellips) : Het geeft aan dat de functie een variabel aantal argumenten accepteert.

Opmerking : Hier kunnen we de buffergrootte specificeren en feitelijk de limiet van de invoer controleren, zodat de hele applicatie niet crasht als gevolg van geheugenoverflow.

Retourwaarde

  • Bij succes retourneert de functie het aantal gelezen waarden.
  • In het geval van een invoerfout voordat gegevens met succes konden worden gelezen, wordt EOF geretourneerd.

Waarom scanf_s() gebruiken?

scanf leest gewoon de invoer die vanaf de console wordt geleverd. C controleert niet of de gebruikersinvoer past in de variabele die u heeft aangewezen. Als je een array hebt met de naam color[3] en je gebruikt scanf voor de string Red, dan werkt het prima, maar als de gebruiker meer dan 3 tekens invoert, begint scanf te schrijven naar het geheugen dat niet tot de color array behoort.

C zal dit niet opvangen of u waarschuwen en het programma kan wel of niet crashen, afhankelijk van of iets probeert toegang te krijgen tot en te schrijven op dat geheugenslot dat niet tot de color array behoort. Dit is waar scanf_s in het spel komt. scanf_s controleert of de gebruikersinvoer in de gegeven geheugenruimte past.

Opmerking : scanf_s() werkt alleen in Microsoft Visual Studio.

Voorbeeld 1: C-programma om de sscanf_s-functie te illustreren

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


Ingang 1

Red 

Uitgang 1

Red 

Ingang 2

Yellow 

Uitgang 2

No Output 

Voorbeeld 2: C-programma om de relatie tussen buffergrootte en arraygrootte te illustreren.

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  ;   }   
  • Als de buffergrootte gelijk is aan of kleiner is dan de grootte van de array, zal het invoeren van groter dan of gelijk aan de buffergrootte leiden tot gegevensverlies, omdat de overtollige gegevens worden afgekapt en de gegevens tot buffergrootte - 1 worden gelezen.
  • Als de buffergrootte groter is dan de grootte van een array, dan
    • het invoeren van een kleinere waarde dan de buffergrootte zal lukken, maar zal een foutmelding geven
    • Als u een invoer groter dan de buffergrootte invoert, leidt dit tot bufferoverflow en geeft u dezelfde fout.

3. fscanf_s() Functie in C

Het verschil tussen fscanf() en fscanf_s() is hetzelfde als dat tussen scanf() en scanf_s(). fscanf_s() is een beveiligde functie die vereist dat de grootte van elk veld van het type c C s S en [ ] wordt doorgegeven als argument onmiddellijk na de variabele.

Syntaxis

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

Parameters

    str : tekenreeks die wordt gebruikt om gegevens op te halen formaat : tekenreeks die de typespecificatie(s) bevat … (ellips) : Het geeft aan dat de functie een variabel aantal argumenten accepteert.

Opmerking : fscanf_s heeft een extra parameter om de buffergrootte te specificeren en feitelijk de limiet van de invoer te controleren.

Retourwaarde

  • Bij succes retourneert de functie het aantal succesvol gelezen waarden.
  • In het geval van een invoerfout voordat gegevens met succes konden worden gelezen, wordt EOF geretourneerd.

Opmerking : fscanf_s werkt alleen in MS Visual studio.

Voorbeeld: C-programma om de functie fscanf_s te illustreren

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


Uitvoer

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

4. sscanf_s() Functie in C

sscanf_s() is een beveiligde functie van sscanf() en voor veilige functies is het nodig dat de grootte van elk veld c C s S en [type wordt doorgegeven als argument onmiddellijk na de variabele.

Syntaxis

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

Parameters

    str : tekenreeks die wordt gebruikt om gegevens op te halen formaat : tekenreeks die de typespecificatie(s) bevat … (ellips) : Het geeft aan dat de functie een variabel aantal argumenten accepteert.

Opmerking : sscanf_s heeft een extra parameter om de buffergrootte te specificeren en feitelijk de limiet van de invoer te controleren.

Retourwaarde

  • Bij succes retourneert de functie het aantal succesvol gelezen waarden.
  • In het geval van een invoerfout voordat gegevens met succes konden worden gelezen, wordt EOF geretourneerd.

Opmerking : sscanf_s() werkt alleen in Microsoft Visual Studio.

Voorbeeld: C-programma om de functie sscanf_s te illustreren

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


Uitvoer

3 blue balls 

Quiz maken