logo

Funcions de biblioteca integrades per a l'entrada de l'usuari | sscanf, scanf_s, fscanf_s, sscanf_s

El llenguatge de programació C proporciona diverses funcions de biblioteca integrades per a l'entrada de l'usuari. En aquest article aprendrem sobre les funcions de biblioteca sscanf scanf_s fscanf_s sscanf_s en C.

1. Funció sscanf() en C

sscanf() s'utilitza per llegir l'entrada amb format de la cadena. Tant les funcions scanf() com sscanf() són similars, l'única diferència entre elles és que la funció scanf() llegeix l'entrada de l'usuari des de l'entrada estàndard com un teclat i la funció sscanf() llegeix l'entrada d'una cadena i emmagatzema l'entrada en una altra cadena.

Sintaxi

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

Paràmetres

    str: cadena d'entrada des de la qual volem llegir les dades.format: una cadena que conté l'especificador de tipus.… (punts suspensius): Indica que la funció accepta un nombre variable d'arguments.

Valor de retorn

  • En cas d'èxit, la funció retorna el nombre de valors llegits correctament.
  • En el cas d'un error d'entrada abans que qualsevol dada es pugui llegir correctament, es retorna l'EOF.

Nota : Hi hauria d'haver almenys tants d'aquests arguments com el nombre de valors emmagatzemats pels especificadors de format.



Exemple: Programa C per il·lustrar la funció 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; } 

Sortida
3 blue balls 

2. scanf_s() Funció en C

Aquesta funció és específica dels compiladors de Microsoft. És el mateix que scanf, excepte que no provoca una sobrecàrrega de memòria intermèdia. La funció scanf_s() és més segura que la funció scanf() ja que proporciona un paràmetre addicional per especificar la mida de la memòria intermèdia que pot evitar el desbordament de la memòria intermèdia.

interfície en java

Sintaxi

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

Paràmetres

    corrent: indica l'objecte Fitxer que identifica el flux.format: és una cadena que conté l'especificador de tipus.… (punts suspensius): Indica que la funció accepta un nombre variable d'arguments.

Nota : Aquí podem especificar la mida de la memòria intermèdia i controlar realment el límit de l'entrada de manera que tota l'aplicació no es col·loqui a causa d'un desbordament de memòria.

Valor de retorn

  • En cas d'èxit, la funció retorna el nombre de valors llegits.
  • En el cas d'un error d'entrada abans que qualsevol dada es pugui llegir correctament, es retorna l'EOF.

Per què utilitzar scanf_s()?

scanf només llegeix qualsevol entrada proporcionada des de la consola. C no verifica si l'entrada de l'usuari s'adaptarà a la variable que heu designat. Si teniu una matriu anomenada color[3] i utilitzeu scanf per a la cadena Red, funcionarà bé, però si l'usuari introdueix més de 3 caràcters, scanf comença a escriure a la memòria que no pertany a la matriu de colors.

C no ho detectarà ni us avisarà i podria o no bloquejar el programa depenent de si alguna cosa intenta accedir i escriure en aquesta ranura de memòria que no pertany a la matriu de colors. Aquí és on entra en joc scanf_s. scanf_s comprova que l'entrada de l'usuari s'ajustarà a l'espai de memòria donat.

Nota : scanf_s() només funcionarà a Microsoft Visual Studio.

Exemple 1: Programa C per il·lustrar la funció 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; } 


Entrada 1

jtextfield
Red

Sortida 1

Red

Entrada 2

Yellow

Sortida 2

No Output

Exemple 2: Programa C per il·lustrar la relació entre la mida de la memòria intermèdia i la mida de la matriu.

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; } 
  • Si la mida de la memòria intermèdia és igual o menor que la mida de la matriu, introduir una mida superior o igual a la memòria intermèdia comportarà la pèrdua de dades, ja que l'excés de dades es truncarà i es llegiran les dades fins a la mida de la memòria intermèdia - 1.
  • Si la mida del buffer és més gran que la mida d'una matriu, aleshores
    • introduir una mida més petita que la memòria intermèdia funcionarà, però donarà un error
    • introduir una mida més gran que la memòria intermèdia provocarà un desbordament de la memòria intermèdia i donarà el mateix error.

3. Funció fscanf_s() en C

La diferència entre fscanf() i fscanf_s() és la mateixa que la de scanf() i scanf_s(). fscanf_s() és una funció segura que requereix que la mida de cada camp de tipus c C s S i [ ] es passi com a argument immediatament després de la variable.

Sintaxi

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

Paràmetres

    str: cadena utilitzada per recuperar dadesformat: cadena que conté l'especificador de tipus… (punts suspensius): Indica que la funció accepta un nombre variable d'arguments.

Nota : fscanf_s té un paràmetre addicional per especificar la mida del buffer i controlar realment el límit de l'entrada.

paràmetre a l'script de shell

Valor de retorn

  • En cas d'èxit, la funció retorna el nombre de valors llegits correctament.
  • En el cas d'un error d'entrada abans que qualsevol dada es pugui llegir correctament, es retorna l'EOF.

Nota : fscanf_s només funcionarà a MS Visual Studio.

Exemple: Programa C per il·lustrar la funció 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); } 


Sortida

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

4. Funció sscanf_s() en C

sscanf_s() és una funció segura de sscanf() i les funcions segures requereixen que la mida de cada camp de tipus c C s S i [ es passi com a argument immediatament després de la variable.

java listnode

Sintaxi

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

Paràmetres

    str: cadena utilitzada per recuperar dadesformat: cadena que conté l'especificador de tipus… (punts suspensius): Indica que la funció accepta un nombre variable d'arguments.

Nota : sscanf_s té un paràmetre addicional per especificar la mida del buffer i controlar realment el límit de l'entrada.

Valor de retorn

  • En cas d'èxit, la funció retorna el nombre de valors llegits correctament.
  • En el cas d'un error d'entrada abans que qualsevol dada es pugui llegir correctament, es retorna l'EOF.

Nota : sscanf_s() només funcionarà a Microsoft Visual Studio.

Exemple: Programa C per il·lustrar la funció 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; } 


Sortida

3 blue balls

Crea un qüestionari