Título: Implementación de printf no termina con null las cadenas Publicado por: huchoko en 6 Abril 2019, 15:24 pm Buenas, he hecho una implementación de printf, sin usar vsnprintf (por que no puedo).
Funciona bien, pero si trato de formatear un número hexadecimal y aveces cadenas, se descontrola todo, por lo que pienso que se me está colando un terminador nulo '\0' . Ejemplo: Código Salida: Código: r8: b8000└ Nótese el carácter "└" el cual no es esperado. Código Las funciones itoa no creo que sean el problema, por que mi implementación no tiene problemas para imprimir enteros. (excepto que se desborda con un número muy grande, eso se arregla fácil) Título: Re: Implementación de printf no termina con null las cadenas Publicado por: CalgaryCorpus en 7 Abril 2019, 01:13 am Tienes que variar el tipo del segundo parametro de va_arg.
Tu solo usas unsigned int (o int) y deberias usar el tipo que calce con el % que se pasa. Mira el ejemplo al final de aqui: https://linux.die.net/man/3/va_arg Título: Re: Implementación de printf no termina con null las cadenas Publicado por: huchoko en 7 Abril 2019, 04:49 am Tienes que variar el tipo del segundo parametro de va_arg. Gracias, pero aún así no me funciona, mismo problema. :-(Tu solo usas unsigned int (o int) y deberias usar el tipo que calce con el % que se pasa. Mira el ejemplo al final de aqui: https://linux.die.net/man/3/va_arg Título: Re: Implementación de printf no termina con null las cadenas Publicado por: CalgaryCorpus en 7 Abril 2019, 05:50 am Muestra el codigo modificado
Título: Re: Implementación de printf no termina con null las cadenas Publicado por: huchoko en 7 Abril 2019, 14:46 pm Mismo problema, hacer un cast de int a char cuando trato de imprimir hexadecimal no imprime nada, y el mismo problema...
Código
Título: Re: Implementación de printf no termina con null las cadenas Publicado por: CalgaryCorpus en 7 Abril 2019, 16:05 pm sugiero que recibas lo que va_arg te retorna en una variable del tipo que pides.
Ejemplo en linea 28 y siguientes: cambia por Código
Y si esto se comporta bien, hacer los mismos con los otros tipos. Título: Re: Implementación de printf no termina con null las cadenas Publicado por: huchoko en 7 Abril 2019, 22:53 pm Ahora si funciona para los enteros, pero aún está el problema con los hexadecimales.
Osea, si le paso el hexadecimal 0xF2, imprime 0xF2, pero no tiene el terminador nulo, lo cual hace que se imprima un caracter aleatorio después de imprimir el hexadecimal. (Sólo pasa cuando se trata de imprimir hexadecimal, los demás están ok) Título: Re: Implementación de printf no termina con null las cadenas Publicado por: RayR en 8 Abril 2019, 01:20 am Ese error se debe a que te falta un break para el case 'x' (y ya que estamos, para el case '%').
Hay más problemas, pero el principal es lo que ya te dijeron, que debes usar variables de distintos tipos según el % que recibas. Tal como lo tienes es una suerte que funcione. Dado que char c es un puntero, cuando se ejecuta esto: Código: charc = va_arg(args, int); Lo que en realidad estás haciendo es que charc apunte a la dirección de memoria cuyo número le enviaste a kputs. Por ejemplo, si le envias 22, charc estará apuntando a la dirección 22. Cuando llamas a itoa, en realidad le estás pasando una dirección de memoria, pero como esta función espera un simple entero, lo interpreta como tal, y por eso no falla. Pero si en algún punto se intentara desreferenciar a charc, tu programa fallaría estrepitosamente ;D, seguramente generando una violación de acceso. charc debería ser un simple int, o unsigned, y para el case 's' debes usar un char *. Título: Re: Implementación de printf no termina con null las cadenas Publicado por: huchoko en 8 Abril 2019, 03:29 am Gracias, funciona perfectamente! Gracias a ambos!
Ese error se debe a que te falta un break para el case 'x' (y ya que estamos, para el case '%'). Ah, ¡esos condenados break! siempre me pasa, y por más que reviso el código siempre se me cola uno ;-)Saludos :) |