Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: javituni en 12 Abril 2013, 22:10 PM

Título: Duda sobre codigo
Publicado por: javituni en 12 Abril 2013, 22:10 PM
Alguien podria decirme que hace el if, la funcion bzero y la funcion sscanf de este condigo? No consigo entenderlo. Gracias

char linea[1024];

if(fgets(linea,1024,fich)){

bzero(argumento,sizeof(argumento));
sscanf(linea,"%s %[^\n]",mandato,argumento);
}
Título: Re: Duda sobre codigo
Publicado por: avesudra en 12 Abril 2013, 22:48 PM
Busca un poco:
bzero:
http://lmgtfy.com/?q=bzero+c+function
sscanf:
http://lmgtfy.com/?q=sscanf+c+function
fgets:
http://lmgtfy.com/?q=fgets+c+function

Lo más difícil ahí es el if quizás, dependiendo del retorno de la función fgets decide una cosa u otra, si la función cumple con su cometido y no falla devuelve la cadena, si encuentra el fin de archivo pues devuelve EOF y si hay un error se devuelve un puntero nulo. Es decir que entra al if cuando la función cumpla con su cometido.
Título: Re: Duda sobre codigo
Publicado por: javituni en 12 Abril 2013, 23:24 PM
antes de preguntar aqui he buscado, pero me sigue sin quedar claro que hace, sobre todo el bzero, y el if ya ha quedado claro, tenia la duda de cuando entraba dentro.
Título: Re: Duda sobre codigo
Publicado por: avesudra en 12 Abril 2013, 23:39 PM
El bzero lo que hace es poner tantos 0 como le indiques en el área apuntada por el puntero que tu le pasas. El sscanf lo que hace es "leer" del array línea una cadena de carácteres y guardarla en mandato y el [^\n] extrae cualquier carácter que no sea el final de línea y lo guarda en argumento.
Título: Re: Duda sobre codigo
Publicado por: rir3760 en 13 Abril 2013, 03:41 AM
avesudra ya dio una explicación sobre el condicional.

Solo un comentario: siendo estrictos no es necesario utilizar la función bzero como programación defensiva (para proteger contra el escenario donde sscanf falle).

En lugar de esa funcion se puede almacenar un '\0' en la primera posicion del array. En el contexto de cadenas el efecto es el mismo:
char linea[1024];

/* ... */

if (fgets(linea, 1024, fich)){
   argumento[0] = '\0';
   sscanf(linea, "%s %[^\n]", mandato, argumento);
}


Una mejor opción es verificar el valor de retorno de sscanf

Un saludo
Título: Re: Duda sobre codigo
Publicado por: javituni en 13 Abril 2013, 18:01 PM
muchas gracias, ya esta solucionado