Diferencia entre scanf() y fgets()

3 minutos de lectura

avatar de usuario
Biswajyoti Das

quiero saber cual es la diferencia entre fgets() y scanf(). Estoy usando C como mi plataforma.

Hay múltiples diferencias. Dos cruciales son:

  • fgets() puede leer desde cualquier archivo abierto, pero scanf() solo lee la entrada estándar.
  • fgets() lee ‘una línea de texto’ de un archivo; scanf() se puede usar para eso, pero también maneja conversiones de cadena a tipos numéricos incorporados.

Mucha gente usará fgets() para leer una línea de datos y luego usar sscanf() para diseccionarlo.

avatar de usuario
Daniel

int scanf(const char * restrict format, ...);

escanear(3) busca cierta patrón definido por el argumento de formato en la entrada dada conocida como Entrada estándar, donde usted define el patrón. La entrada dada a escanear(3)dependiendo de su variante (scanf, fscanf, sscanf, vscanf, vsscanf, vfscanf), puede ser una cadena o un archivo.

char *fgets(char * restrict str, int size, FILE * restrict stream);

fgets(3) solo lee un línea del archivo de entrada Arroyo y copie los bytes como una cadena de terminación nula en el búfer calle y limitar la salida al búfer a bytes dados en Talla.

avatar de usuario
petirrojos kelly

Scanf no realiza comprobaciones de límites. Es probable que fgets sea la mejor opción. Luego puede usar sscanf() para evaluarlo.

Buena discusión sobre el 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 recibió una reprimenda por olvidar esto, no yo)

  • Para tipos numéricos, scanf() no necesita hacer una verificación de límites. Para los tipos de cadena, puede decirle a scanf() que realice una verificación de límites.

    –Jonathan Leffler

    9 de agosto de 2009 a las 21:45

avatar de usuario
joel reyes

se debe notar que scanf las especificaciones del patrón permiten límites de ancho de campo:

scanf( " %80s", mybuffer );

Pero donde printf() permite pasar el ancho como una variable (con ‘*’):

printf( "My name is %*s.\n", 20, name );

scanf() no. (Interpreta el ‘*’ como una bandera 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 de campo 40 en el scanf() con el ancho de búfer 40 en la declaración del búfer.

scanf analiza una cadena que lee (o crea) y fgets lee una línea de un ARCHIVO* abierto. ¿O te refieres a fscanf?

La principal diferencia radica en el hecho de que scanf no tiene límites en la cantidad 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 * formato, …);

Puede ver que el segundo parámetro de fgets impone leer como máximo tamaño char.

Otra clara diferencia es el valor de retorno: fgets devolver un puntero a dest en el éxito; scanf devolver el número de elementos de entrada emparejados y asignados con éxito. Entonces el escanear la función escanea la entrada de acuerdo con formatoy lee la entrada del flujo de entrada estándar Entrada estándartiempo fgets lee la entrada de ARCHIVO * transmisión por defecto.

En conclusión, podrías usar scanf 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\nla salida es 12345mientras fgets lee y regresa hasta \n (incluido), agregando un \0 al final como un terminador de cadena.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad