Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: class_OpenGL en 29 Julio 2016, 16:55 pm



Título: (Consulta) Pasando a las funciones fscanf argumentos nulos
Publicado por: class_OpenGL en 29 Julio 2016, 16:55 pm
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:

Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.        fscanf(stdin, "%s[^'\n']", NULL);
  5.        fprintf(stdout, "Linea ignorada");
  6.  
  7.        return 0;
  8. }

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


Título: Re: (Consulta) Pasando a las funciones fscanf argumentos nulos
Publicado por: do-while en 29 Julio 2016, 17:34 pm
¡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 (http://stackoverflow.com/questions/5168604/null-arg-allowed-to-sscanf) 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!


Título: Re: (Consulta) Pasando a las funciones fscanf argumentos nulos
Publicado por: class_OpenGL en 29 Julio 2016, 20:19 pm
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++


Título: Re: (Consulta) Pasando a las funciones fscanf argumentos nulos
Publicado por: ivancea96 en 29 Julio 2016, 21:40 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á.
Código
  1. fscanf(stdin, "%*s[^'\n']");


Título: Re: (Consulta) Pasando a las funciones fscanf argumentos nulos
Publicado por: class_OpenGL en 29 Julio 2016, 22:01 pm
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...

Código
  1. fscanf(file, "%64*s");

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


Título: Re: (Consulta) Pasando a las funciones fscanf argumentos nulos
Publicado por: ivancea96 en 29 Julio 2016, 22:48 pm
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 (http://en.cppreference.com/w/cpp/io/c/fscanf)


Título: Re: (Consulta) Pasando a las funciones fscanf argumentos nulos
Publicado por: class_OpenGL en 30 Julio 2016, 01:51 am
Ah gracias por la página!