- scanf() : La función de la biblioteca C int scanf (const char *format, …) lee la entrada formateada desde stdin.
Syntax: int scanf(const char *format, ...) Return type: Integer Parameters: format: string that contains the type specifier(s) "..." (ellipsis): indicates that the function accepts a variable number of arguments
Cada argumento debe ser una dirección de memoria donde se escribe el resultado convertido. En caso de éxito, la función devuelve el número de variables rellenadas. En caso de una falla de entrada, antes de que los datos puedan leerse con éxito, se devuelve EOF.
Escriba los especificadores que se pueden usar en scanf:%c — Character %d — Signed integer %f — Floating point %s — String
//C program t illustrate scanf statement
#include <stdio.h>
#include <stdlib.h>
int
main()
{
char
a[10];
printf
(
"Please enter your name : \n"
);
//scanf statement
scanf
(
"%s"
, a);
printf
(
"You entered: \n%s"
, a);
return
0;
}
Aporte:
Geek
Producción:
Please enter your name : You entered: Geek
- sscanf(): sscanf() se usa para leer la entrada formateada de la string.
Syntax: int sscanf ( const char * s, const char * format, ...); Return type: Integer Parameters: s: string used to retrieve data format: string that contains the type specifier(s) … : arguments contains pointers to allocate storage with appropriate type. There should be at least as many of these arguments as the number of values stored by the format specifiers.
En caso de éxito, la función devuelve el número de variables rellenadas. En el caso de una falla de entrada, antes de que los datos puedan leerse con éxito, se devuelve EOF.
// C program to illustrate sscanf statement
#include <stdio.h>
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
- fscanf() : fscanf() lee datos formateados del archivo y los almacena en variables.
Syntax: int fscanf(FILE *stream, const char *format, ...) Parameters: Stream: pointer to the File object that identifies the stream. format : is a string that contains the type specifier(s)
En caso de éxito, la función devuelve el número de variables rellenadas. En el caso de una falla de entrada, antes de que los datos puedan leerse con éxito, se devuelve EOF.
// C program to illustrate sscanf statement
// This program will run on system having the file file.txt
#include <stdio.h>
#include <stdlib.h>
int
main()
{
char
s1[10], s2[10], s3[10];
int
year;
// file pointer
FILE
* fp;
// opening/creation of file
fp =
fopen
(
"file.txt"
,
"w+"
);
// storing string in the file
fputs
(
"Hello World its 2017"
, fp);
// sets the file position to the beginning of the file
rewind
(fp);
// taking input from file
fscanf
(fp,
"%s %s %s %d"
, s1, s2, s3, &year);
printf
(
"String1 |%s|\n"
, s1 );
printf
(
"String2 |%s|\n"
, s2 );
printf
(
"String3 |%s|\n"
, s3 );
printf
(
"Integer |%d|\n"
, year );
// close file pointer
fclose
(fp);
return
(0);
}
Producción:
String1 |Hello| String2 |World| String3 |its| Integer |2017|
- scanf_s() : esta función es específica de los compiladores de Microsoft. Es lo mismo que scanf, excepto que no provoca la sobrecarga del búfer.
Syntax: int scanf_s(const char *format [argument]...); argument(parameter): here you can specify the buffer size and actually control the limit of the input so you don't crash the whole application.
En caso de éxito, la función devuelve el número de variables rellenadas. En el caso de una falla de entrada, antes de que los datos puedan leerse con éxito, se devuelve EOF.
¿Por qué usar scanf_s()?
scanf solo lee cualquier entrada que se proporcione desde la consola. C no verifica si la entrada del usuario encajará en la variable que ha designado.
Si tiene una array llamada color[3] y usa scanf para «Rojo», funcionará bien, pero si el usuario ingresa más de 3 caracteres, scanf comienza a escribir en la memoria que no pertenece al color. C no detectará esto ni le advertirá y podría o no bloquear el programa, dependiendo de si algo intenta acceder y escribir en esa ranura de memoria que no pertenece al color. Aquí es donde entra en juego scanf_s. scanf_s verifica que la entrada del usuario quepa en el espacio de memoria dado.// C program to illustrate sscanf_s statement
// scanf_s() will only work in Microsoft Visual Studio.
#include <stdio.h>
#include <stdlib.h>
int
main()
{
char
a[5];
// sizeof(a) is buffer size
scanf_s(
"%s"
, a,
sizeof
(a));
printf
(
"\n%s "
, a);
return
0;
}
Aporte:
Red
Producción:
Red
Aporte:
Yellow
Producción:
No Output
Ilustrando la relación entre el tamaño del búfer y el tamaño de la array.
C
// C program
// consumes the Enter key
// (newline character) pressed after input
#include<stdio.h>
char
ch[100000];
printf
(
"Enter characters: "
);
scanf_s(
"%s"
, ch, 99999);
getchar
();
C++
// C++ program
// consumes the Enter key
// (newline character) pressed after input
#include "stdafx.h"
int
_tmain(
int
argc, _TCHAR* argv[])
{
// example
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 array, ingresar un tamaño mayor o igual que el tamaño del búfer no hará nada.
- Si el tamaño del búfer es mayor que el tamaño de una array, entonces
- ingresar un tamaño más pequeño que el tamaño del búfer funcionará pero dará un error
«Error de verificación en tiempo de ejecución n.º 2: la pila alrededor de la variable ‘nombre_variable’ estaba dañada».
- ingresar más grande que el tamaño del búfer no hará nada y dará el mismo error.
- ingresar un tamaño más pequeño que el tamaño del búfer funcionará pero dará un error
- fscanf_s() : La diferencia entre fscanf() y fscanf_s() es la misma que entre scanf() y scanf_s(). fscanf_s() es una función segura y las funciones seguras requieren que el tamaño de cada campo de tipo c, C, s, S y [ se pase como un argumento inmediatamente después de la variable.
Syntax: int fscanf_s( FILE *stream, const char *format ,[argument ]... ); fscanf_s has an extra argument(parameter) where you can specify the buffer size and actually control the limit of the input.
En caso de éxito, la función devuelve el número de variables rellenadas. En el caso de una falla de entrada, antes de que los datos puedan leerse con éxito, se devuelve EOF.
//C program to illustrate fscanf_s statement
//This program will run on MS Visual studio
#include <stdio.h>
#include <stdlib.h>
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|
- sscanf_s() : sscanf_s() es una función segura de sscanf() y las funciones seguras requieren que el tamaño de cada campo de tipo c, C, s, S y [ se pase como argumento inmediatamente después de la variable.
Syntax: int sscanf_s(const char *restrict buffer, const char *restrict format, ...); sscanf_s has an extra argument(parameter) where you can specify the buffer size and actually control the limit of the input.
En caso de éxito, la función devuelve el número de variables rellenadas. En el caso de una falla de entrada, antes de que los datos puedan leerse con éxito, se devuelve EOF.
//C program to illustrate sscanf_s statement
//This program will run on MS Visual studio
#include <stdio.h>
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
Nota: sscanf_s() solo funcionará en Microsoft Visual Studio.
Este artículo es una contribución de Kartik Ahuja . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA