(Consulta) Pasando a las funciones fscanf argumentos nulos

Iniciado por class_OpenGL, 29 Julio 2016, 16:55 PM

0 Miembros y 2 Visitantes están viendo este tema.

class_OpenGL

Hola, me preguntaba si se puede pasar argumentos nulos a las funciones fscanf para que se ignore tal argumento.

Código de ejemplo donde se ilustra como ignorar una línea. Solo funcionaría si se pueden pasar argumentos nulos:

#include <stdio.h>

int main() {
       fscanf(stdin, "%s[^'\n']", NULL);
       fprintf(stdout, "Linea ignorada");

       return 0;
}


Esto lo he probado bajo Linux (Debian) y me ha funconado sin que se produzcan errores. Eso si, el compilador me ha advertido. Lo que no sé si es estándar o me ha funcionado de casualidad.

P.D.: En el caso que esto no funcione como debiera, ¿hay alguna forma de que fscanf ignore lo que yo quiera?

Muchas gracias

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

do-while

¡Buenas!

Me has dejado con la mosca detrás de la oreja, así que lo he probado y lo habré ejecutado unas 10-15 veces en Debian Stretch sin ningún problema. Por lo que comentan en stackoverflow el estándar exige que si se lee una cadena entonces hay que proporcionar un argumento con la capacidad de leer hasta el primer espacio y almacenar el caracter nulo. Pero gcc debe de tener una implementación no estándar de scanf, así que los puntero a NULL (al menos en el caso de cadenas) se ignoran.

A ver si encuentro algo más de información.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

class_OpenGL

Yo también ando buscando, pero solamente encontré lo que dices tu. Lo más seguro es que sea eso entonces. Algo en lo que me he fijado es que no se extraen datos cuando pasas un puntero NULL. Esto lo digo porque, por ejemplo, la línea que ejecuto se supone que ignoraría una línea, pero no es así. Lo sé porque al intentar ignorar una línea con esa función y parámetros determinados, no se ignora, simplemente es como si la función no se hubiera ejecutado o llamado. Sabiendo eso, lo más probable es que como tu dices, sea una implementación no estándar. Ahora mismo no puedo, pero en un rato lo probaré bajo Windows para ver si funciona con el compilador VC++

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

ivancea96

Cita de: class_OpenGL en 29 Julio 2016, 16:55 PM
P.D.: En el caso que esto no funcione como debiera, ¿hay alguna forma de que fscanf ignore lo que yo quiera?
Si pones un asterisco en la cadena de formato en los especificadores, los ignorará.
fscanf(stdin, "%*s[^'\n']");

class_OpenGL

Vaya, eso es información muy interesante. ¡Gracias!... Otra pequeña pregunta, si por ejemplo, quiero que solo ignore 64 caracteres, ¿la estrctura sería...

fscanf(file, "%64*s");

... o sería con el asterisco primero y luego el 64 (el 64 es un ejemplo)?

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

ivancea96

Porcentaje, asterisco, longitud de cadena, tamaño de variable, tipo de variable.
Pero bueno, todo eso lo tienes mejor explicado en http://en.cppreference.com/w/cpp/io/c/fscanf

class_OpenGL


Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL