funciona - scanf c
Diferencia entre scanf() y fgets() (6)
Cabe señalar que las especificaciones de patrón de scanf
permiten límites de ancho de campo:
scanf( " %80s", mybuffer );
Pero, donde printf()
permite que el ancho se pase como una variable (con ''*''):
printf( "My name is %*s./n", 20, name );
scanf()
no lo hace. (Interpreta el ''*'' como un indicador para suprimir / ignorar el campo por completo.) Lo que significa que terminas haciendo cosas como esta:
#define NAMEWIDTH 40
char buffer[ NAMEWIDTH + 4 ];
...
scanf( " %40x", buffer );
y no hay forma de conectar el ancho del campo 40 en el scanf()
con el ancho del búfer 40 en la declaración del búfer.
Quiero saber cuál es la diferencia entre fgets()
y scanf()
. Estoy usando C como mi plataforma.
Hay multiples diferencias Dos cruciales son:
-
fgets()
puede leer desde cualquier archivo abierto, peroscanf()
solo lee la entrada estándar. -
fgets()
lee "una línea de texto" de un archivo;scanf()
puede usarse para eso, pero también maneja conversiones de cadenas a tipos numéricos integrados.
Muchas personas usarán fgets()
para leer una línea de datos y luego usar sscanf()
para analizarla.
La principal diferencia radica en el hecho de que scanf
no tiene límites en el número de caracteres que se pueden leer (en su uso predeterminado), mientras que fgets
tiene un número máximo de caracteres que se pueden leer.
Ver el prototipo de las dos funciones:
char * fgets (char * dest, int size, FILE * stream);
int scanf (const char * format, ...);
Puedes ver que el segundo parámetro de fgets
impone para leer como máximo el tamaño char.
Otra diferencia clara es el valor de retorno: fgets
devuelve un puntero a dest
en caso de éxito; scanf
devuelve el número de elementos de entrada coincidentes y asignados con éxito. Luego, la función scanf escanea la entrada de acuerdo con el formato , y lee la entrada de la secuencia estándar de entrada estándar , mientras que fgets
lee la entrada de la secuencia FILE * de manera predeterminada.
En conclusión, podría usar scanf
para leer datos de un ARCHIVO e insertarlos en una matriz de tamaño fijo (por ejemplo) no tiene mucho sentido. Una ventaja de scanf
es el formato de los datos de salida: si la función lee 12345/n
, la salida es 12345
, mientras que fgets lee y devuelve hasta /n
(incluido), agregando un /0
al final como un terminador de cadena.
Scanf no realiza comprobación de límites. Es probable que fgets sea la mejor opción. Luego puedes usar sscanf () para evaluarlo.
Buena discusión del tema aquí: http://cboard.cprogramming.com/c-programming/109243-scanf-vs-fgets.html
¿Cómo permite que se ingresen espacios usando scanf? (Ese fue mi gemelo malvado que me dieron clases por olvidar esto, no yo)
scanf analiza una cadena que leyó (o creó), y fgets lee una línea desde un ARCHIVO abierto *. ¿O te refieres a fscanf?
int scanf(const char * restrict format, ...);
scanf (3) busca cierto patrón definido por el argumento de formato en la entrada dada conocida como stdin , donde usted define el patrón. La entrada dada a scanf (3) , dependiendo de su variante (scanf, fscanf, sscanf, vscanf, vsscanf, vfscanf), podría ser una cadena o un archivo.
char *fgets(char * restrict str, int size, FILE * restrict stream);
fgets (3) simplemente lee una línea de la secuencia del archivo de entrada y copia los bytes como una cadena de terminación nula al str de búfer y limita la salida al búfer a los bytes dados en tamaño .