Tema destacado: Nueva página de elhacker.net en Google+ 
Autor
|
Tema: Problema con el compilador gcc de ubuntu!! (Leído 4,645 veces)
|
Smig0l
Desconectado
Mensajes: 9
|
Hola, antes de nada os felicito por el foro porque esta genial!! Tengo un problemita con el compilador gcc. Compilo este sencillo programa en C: #include <stdio.h> main(){ float base,altura,area; char opcion='N'; printf("\nIntroduce Base: "); scanf("%f",&base); printf("\nIntroduce Altura: "); scanf("%f",&altura); area=(base*altura/2); printf("\nEl area es: %f",area); printf("\nTerminar?(S/N):"); fflush(stdin); scanf("%c",&opcion); if (opcion=='N'){ main(); }else{ } }
El resultado es el siguiente:
******@******-acer:~/Escritorio$ ./a.out
Introduce Base: 8
Introduce Altura: 7
El area es: 28.000000 Terminar?(S/N):******@******-acer:~/Escritorio$
El problema esta en que se salta el ultimo scanf y no se porque. Lo probe en dos ordenadores y no funciona, tambien probe con el fgets y tampoco. Lo he compilado con el visual C y me funciona. Alguien puede ayudarme???
|
|
|
|
|
En línea
|
|
|
|
|
Eternal Idol
|
fflush(stdin);
El comportamiento de eso es indefinido y es lo que genera tu problema, pone fflush stdin en Google.
|
|
|
|
|
En línea
|
 La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
Smig0l
Desconectado
Mensajes: 9
|
No funciona,quite el fflush y sigue pasando lo mismo, alguna solucion mas??
|
|
|
|
|
En línea
|
|
|
|
|
Eternal Idol
|
Por supuesto que sacando eso tampoco funciona, es lo que lo hace funcionar en VC++ pero como te dije su comportamiento es indenido por el standard y no hace lo mismo en *NIX. Usa el Google tal como te dije para entender el problema y averiguar sobre las posibles soluciones.
|
|
|
|
|
En línea
|
 La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
Smig0l
Desconectado
Mensajes: 9
|
Pero el problema que tengo esque el compilador se salta la sentencia del scanf porque quiere, mientras que el visual C no se la salta. Pero lo raro eske solo se salta ese scanf porque los scanf de la base y la altura van perfectos. Y lo del fflush ya sabia lo que hacia, sirve para limpiar el buffer del teclado. estuve buscando y en unix el fflush no funciona, pero no encontre ninguna solucion o alternativa. Alguna idea??
|
|
|
|
|
En línea
|
|
|
|
|
Eternal Idol
|
En VC++ funciona por el fflush ... si lo sacas tenes el mismo resultado que en *NIX.
Usa fgets y sscanf.
|
|
|
|
|
En línea
|
 La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
alki
Desconectado
Mensajes: 307
|
Buenas Veamos un programa aun mas sencillo: #include <stdio.h> main () { char opcion = 's'; while (opcion == 's') { printf("Quieres seguir?:"); opcion = getchar(); } return 0; } Aqui estoy usando la funcion getchar() para obtener el caracter. Inserto el primer caracter y todo bien, pero la segunda vez que sale el mensaje se coge el caracter "salto de linea". He estado leyendo por ahi y dicen que para nada usar fflush(stdin). ¿Cual es la solucion correcta en C para este problema? Un Saludo
|
|
|
|
|
En línea
|
|
|
|
Smig0l
Desconectado
Mensajes: 9
|
Probe con el fgets y el sscanf fgets(&cadena,10,stdin); sscanf(&cadena,"%c",&opcion);
y me sigue pasando lo mismo.
|
|
|
|
|
En línea
|
|
|
|
|
Eternal Idol
|
Probe con el fgets y el sscanf
y me sigue pasando lo mismo.
¿Lo usaste tambien para los anteriores scanf? Buenas
Veamos un programa aun mas sencillo:
Aqui estoy usando la funcion getchar() para obtener el caracter. Inserto el primer caracter y todo bien, pero la segunda vez que sale el mensaje se coge el caracter "salto de linea". He estado leyendo por ahi y dicen que para nada usar fflush(stdin).
¿Cual es la solucion correcta en C para este problema?
Con las funciones que mencione antes va bien: char l[128]; fgets(l, sizeof(l), stdin); sscanf(l, "%c", &opcion);
|
|
|
|
« Última modificación: 15 Marzo 2009, 15:26 por Eternal Idol »
|
En línea
|
 La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
-Ramc-
Desconectado
Mensajes: 493
|
No uses fflush está indefinido su funcionamiento ya que sólo sirve los miercoles y fines de semana(A veces no todos los miercoles). The function fflush() forces a write of all buffered data for the given output or update stream via the stream's underlying write function. http://c.conclase.net/librerias/funcion.php?fun=fflushCon lo que menciona Eternal Idol sí funciona, pruebalo.
|
|
|
|
« Última modificación: 15 Marzo 2009, 15:33 por -Ramc- »
|
En línea
|
Shhh... be vewy, vewy, quiet! I'm hunting wabbits...LA PANDILLA MAS GRANDE DE MI CIUDAD, SE LLAMA POLICIA NACIONAL.
|
|
|
Smig0l
Desconectado
Mensajes: 9
|
Con lo del fgets y el sscanf y que me funciona, pero tengo un problema, cuando le pongo en terminar?? algo que no sea 'n' o 'N' me da un error: Fallo de segmentacion. Y lo que tendria que hacer seria finalizar el programa y ya esta, no?? #include <stdio.h> main(){ float base,altura,area; char opcion='N',cadena; printf("\nIntroduce Base: "); fgets(&cadena,10,stdin); sscanf(&cadena,"%f",&base); printf("\nIntroduce Altura: "); fgets(&cadena,10,stdin); sscanf(&cadena,"%f",&altura); area=(base*altura/2); printf("\nEl area es: %f",area); printf("\nTerminar?(S/N):"); fgets(&cadena,10,stdin); sscanf(&cadena,"%c",&opcion); if (opcion=='N' || opcion=='n'){ main(); }else{ } }
|
|
|
|
|
En línea
|
|
|
|
|
Eternal Idol
|
Lo raro es que no te de una excepcion antes, estas leyendo mas memoria de la que reservaste para cadena (un caracter) ... mira el ejemplo que puse para arreglarlo.
|
|
|
|
« Última modificación: 15 Marzo 2009, 15:58 por Eternal Idol »
|
En línea
|
 La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
-Ramc-
Desconectado
Mensajes: 493
|
Acabo de compilar y probar y con gcc funciona correctamente.
gcc 4.2.3
|
|
|
|
|
En línea
|
Shhh... be vewy, vewy, quiet! I'm hunting wabbits...LA PANDILLA MAS GRANDE DE MI CIUDAD, SE LLAMA POLICIA NACIONAL.
|
|
|
|
vertexSymphony
|
|
|
|
|
|
En línea
|
Mail/PGP/XMPP/D* gpg --recv-keys --keyserver pgp.mit.edu 0xCD21671D
|
|
|
|
Eternal Idol
|
Esta bien pero ... ¿Entonces usamos eso - y fflush(stdin) en Windows - en lugar de olvidarnos de scanf?  PD. El codigo de ejemplo no compila, el prototipo no coincide sdtin_flush vs stdin_flush. Ahora lo arreglo ...
|
|
|
|
|
En línea
|
 La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
|
|