Funciones de biblioteca incorporadas para entrada del usuario | sscanf, scanf_s, fscanf_s, sscanf_s

El lenguaje de programación C proporciona varias funciones de biblioteca incorporadas para la entrada del usuario. En este artículo aprenderemos sobre las funciones de la biblioteca sscanf scanf_s fscanf_s sscanf_s en C.

1. Función sscanf() en C

sscanf() se utiliza para leer la entrada formateada de la cadena. Ambas funciones scanf() y sscanf() son similares, la única diferencia entre ellas es que la función scanf() lee la entrada del usuario desde la entrada estándar como un teclado y la función sscanf() lee la entrada de una cadena y almacena la entrada en otra cadena.

Sintaxis

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

Parámetros

    cadena : Cadena de entrada de la que queremos leer datos. formato : una cadena que contiene los especificadores de tipo. … (elipsis) : Indica que la función acepta un número variable de argumentos.

Valor de retorno

  • En caso de éxito, la función devuelve el número de valores leídos correctamente.
  • En el caso de un error de entrada antes de que se pueda leer correctamente cualquier dato, se devuelve EOF.

Nota : Debe haber al menos tantos de estos argumentos como el número de valores almacenados por los especificadores de formato.

Ejemplo: Programa C para ilustrar la función 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  ;   }   

Producción
3 blue balls  

2. Función scanf_s() en C

Esta función es específica de los compiladores de Microsoft. Es lo mismo que scanf excepto que no provoca una sobrecarga del búfer. La función scanf_s() es más segura que la función scanf() ya que proporciona un parámetro adicional para especificar el tamaño del búfer que puede evitar el desbordamiento del búfer.

Sintaxis

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

Parámetros

    arroyo : Puntero al objeto Archivo que identifica la secuencia. formato : Es una cadena que contiene los especificadores de tipo. … (elipsis) : Indica que la función acepta un número variable de argumentos.

Nota : Aquí podemos especificar el tamaño del búfer y controlar el límite de la entrada para que toda la aplicación no falle debido al desbordamiento de la memoria.

Valor de retorno

  • En caso de éxito, la función devuelve el número de valores leídos.
  • En el caso de un error de entrada antes de que se pueda leer correctamente cualquier dato, se devuelve EOF.

¿Por qué utilizar scanf_s()?

scanf simplemente lee cualquier entrada proporcionada desde la consola. C no verifica si la entrada del usuario encajará en la variable que usted ha designado. Si tiene una matriz llamada color[3] y usa scanf para la cadena Red, funcionará bien, pero si el usuario ingresa más de 3 caracteres, scanf comienza a escribir en la memoria que no pertenece a la matriz de colores.

C no detectará esto ni le advertirá y podría bloquear o no el programa dependiendo de si algo intenta acceder y escribir en esa ranura de memoria que no pertenece a la matriz de colores. Aquí es donde entra en juego scanf_s. scanf_s verifica que la entrada del usuario encaje en el espacio de memoria dado.

Nota : scanf_s() solo funcionará en Microsoft Visual Studio.

Ejemplo 1: Programa C para ilustrar la función 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

Red 

Salida 1

Red 

Entrada 2

Yellow 

Salida 2

No Output 

Ejemplo 2: Programa C para ilustrar la relación entre el tamaño del búfer y el tamaño de la matriz.

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 el tamaño del búfer es igual o menor que el tamaño de la matriz, ingresar un tamaño mayor o igual al tamaño del búfer provocará la pérdida de datos, ya que los datos sobrantes se truncarán y se leerán los datos hasta el tamaño del búfer - 1.
  • Si el tamaño del búfer es mayor que el tamaño de una matriz, entonces
    • ingresar un tamaño menor que el tamaño del búfer funcionará pero dará un error
    • ingresar un tamaño mayor que el del búfer provocará un desbordamiento del búfer y generará el mismo error.

3. Función fscanf_s() en C

La diferencia entre fscanf() y fscanf_s() es la misma que la de scanf() y scanf_s(). fscanf_s() es una función segura que requiere que el tamaño de cada campo de tipo c C s S y [ ] se pase como argumento inmediatamente después de la variable.

Sintaxis

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

Parámetros

    cadena : cadena utilizada para recuperar datos formato : cadena que contiene los especificadores de tipo … (elipsis) : Indica que la función acepta un número variable de argumentos.

Nota : fscanf_s tiene un parámetro adicional para especificar el tamaño del búfer y controlar el límite de la entrada.

Valor de retorno

  • En caso de éxito, la función devuelve el número de valores leídos correctamente.
  • En el caso de un error de entrada antes de que se pueda leer correctamente cualquier dato, se devuelve EOF.

Nota : fscanf_s funcionará sólo en MS Visual Studio.

Ejemplo: programa en C para ilustrar la función 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  );   }   


Producción

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

4. Función sscanf_s() en C

sscanf_s() es una función segura de sscanf() y las funciones seguras requieren que el tamaño de cada campo c C s S y [ tipo se pase como argumento inmediatamente después de la variable.

Sintaxis

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

Parámetros

    cadena : cadena utilizada para recuperar datos formato : cadena que contiene los especificadores de tipo … (elipsis) : Indica que la función acepta un número variable de argumentos.

Nota : sscanf_s tiene un parámetro adicional para especificar el tamaño del búfer y controlar el límite de la entrada.

Valor de retorno

  • En caso de éxito, la función devuelve el número de valores leídos correctamente.
  • En el caso de un error de entrada antes de que se pueda leer correctamente cualquier dato, se devuelve EOF.

Nota : sscanf_s() solo funcionará en Microsoft Visual Studio.

Ejemplo: programa en C para ilustrar la función 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  ;   }   


Producción

3 blue balls 

Crear cuestionario