logo

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 halenformaat: 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

concat java-reeks
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 halenformaat: 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