Por partes ...
El programa que publicas tiene deficiencias como: el tipo de retorno de getchar es int, no se vacía explícitamente la salida estándar, vaciar el bufer de la entrada estándar como se indica no es valido, si se va a imprimir una literal es mejor utilizar puts y por ultimo "return(0);" no es una llamada a función y por ende los paréntesis están de mas.
----
----
Opciones hay varias: fgets + sscanf, el mentado bucle o bien scanf mas algunos especificadores de formato. Cual elegir lo decide el contexto.
Un saludo
Cita de: 0x3c en 26 Enero 2013, 22:55 PMcomo ya he dicho en otras ocasiones estoy siguiendo un libro para aprender a programar en C, en el capitulo 13 hay un codigo para un programa que se supone lo que hace es comparar dos caracteresTe recomendaría buscar otro libro, para sugerencias sobre alguno bueno nada mejor que el motor de búsqueda de los foros.
El programa que publicas tiene deficiencias como: el tipo de retorno de getchar es int, no se vacía explícitamente la salida estándar, vaciar el bufer de la entrada estándar como se indica no es valido, si se va a imprimir una literal es mejor utilizar puts y por ultimo "return(0);" no es una llamada a función y por ende los paréntesis están de mas.
----
Cita de: mr.blood en 27 Enero 2013, 11:34 AMEn C estándar tampoco vale como solución ya que la llamada a setbuf termina como una llamada a setvbuf y esta ultima debe ser llamada antes de cualquier uso del stream (salvo su apertura).
Te dejo este codigo, compilado con GCC a mi me funciona sin problema alguno.
Puedes usar setbuff o setbuffer para limpiar el buffer de entrada
----
Cita de: avesudra en 27 Enero 2013, 12:26 PMPrimero la pedantería: el tipo de retorno de la función getchar es int y faltan paréntesis para obtener el resultado esperado:
Las demás formas de hacerlo son parches para corregir.Durasno en ese caso deberías comprobar también si es EOF así que quedaría así:Código (c) [Seleccionar]char c;
while(c=getchar() != '\n' && c != EOF){}
Código (c) [Seleccionar]
int ch;
/* ... */
while ((ch = getchar()) != EOF && ch != '\n')
;
Cita de: avesudra en 27 Enero 2013, 12:26 PMPero como ya digo son parches. Hacerlo bien no mata a nadie:No puede decirse que la solución en base a un bucle sea un parche cuando, si se piensa un poco, garantiza el descarte de la linea sin importar su longitud, algo que no sucede al utilizar fgets. Por ejemplo si en tu programa la primera linea tiene mas de 79 caracteres su salida no es la correcta.Código (c) [Seleccionar]#include <stdio.h>
int main()
{
char a,b;
char buffer[80];
printf("Which character is bigger?\n");
printf("Type a single character:");
fgets(buffer,sizeof(buffer),stdin);
sscanf(buffer,"%c",&a);
printf("Type another character:");
fgets(buffer,sizeof(buffer),stdin);
sscanf(buffer,"%c",&b);
if(a > b)
{
printf("'%c' is greater than '%c'!\n",a,b);
}
else if(b > a)
{
printf("'%c' is greater than '%c'!\n",b,a);
}
else
{
printf("Next time don't press the same character");
}
return(0);
}
Opciones hay varias: fgets + sscanf, el mentado bucle o bien scanf mas algunos especificadores de formato. Cual elegir lo decide el contexto.
Un saludo