Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: engel lex en 25 Junio 2013, 01:12 am



Título: duda con un micro codigo....
Publicado por: engel lex en 25 Junio 2013, 01:12 am
tengo

Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3. char buff[1];
  4. void entrada(){
  5.     printf("texto para entrada: ");
  6.     scanf("%s",buff);
  7. }
  8. void salida(){
  9.     printf("fin");
  10. }
  11. int main (){
  12.    entrada();
  13.    salida();
  14.    system("cmd.exe /c pause");
  15.    return 0;
  16. }

lo compilo en netbeans con cygwin (por eso el cmd.exd en system)

lo lógico es que la salida sea
Código:
texto para entrada: a
fin
Presione una tecla para continuar . . .
(la "a" es el valor que ingreso)

pero la salida real es

Código:
texto para entrada: a
Presione una tecla para continuar . . .

fin

mi duda es:
¿por qué muestra el "fin" despues del system si se llama antes?


Título: Re: duda con un micro codigo....
Publicado por: BlackZeroX en 25 Junio 2013, 01:18 am
Usa fflush(stdout) así:

Código
  1.  
  2. void salida(){
  3.     printf("fin");
  4.     fflush(stdout);
  5. }
  6.  
  7.  

Si no ocupas parametros usa puts();

Código
  1.  
  2. void salida(){
  3.     puts("fin");
  4. }
  5.  
  6.  

o termina la cadena con un salto de linea

Código
  1.  
  2. void salida(){
  3.     printf("fin\n");
  4. }
  5.  
  6.  

Dulces Lunas!¡.


Título: Re: duda con un micro codigo....
Publicado por: MeCraniDOS en 25 Junio 2013, 01:25 am
Y ese código no te da errores...?

Prueba con este:


Código
  1. #include <stdio.h>
  2.  
  3. void entrada();
  4. void salida();
  5.  
  6. int main ()
  7. {
  8.    entrada();
  9.  
  10.    salida();
  11.  
  12.    fflush(stdin);
  13.    getchar();
  14. }
  15.  
  16. void entrada()
  17. {
  18.    char buff[1];
  19.  
  20.    printf("texto para entrada: ");
  21.    scanf("%s",buff);
  22.  
  23. }
  24. void salida()
  25. {
  26.    printf("\nfin");
  27. }
  28.  

Saludos


Título: Re: duda con un micro codigo....
Publicado por: engel lex en 25 Junio 2013, 01:34 am
no, no me entendieron...

lo que estoy no es pidiendo ayuda para hacer el codigo... es solo ese codigo... quiero responder una simple y única pregunta...

¿por qué con el código declarado por mi previamente me imprime el system antes que la salida?

y bueno, agregaré otra pregunta...
¿si uds corren ese código, les pasa lo mismo?


(por cierto, tiene un error el buff es [2] no [1] por la condicion "s" del scanf)


Título: Re: duda con un micro codigo....
Publicado por: MeCraniDOS en 25 Junio 2013, 01:43 am
no, no me entendieron...

lo que estoy no es pidiendo ayuda para hacer el código... es solo ese código... quiero responder una simple y única pregunta...

¿por qué con el código declarado por mi previamente me imprime el system antes que la salida?

y bueno, agregaré otra pregunta...
¿si uds corren ese código, les pasa lo mismo?


(por cierto, tiene un error el buff es [2] no [1] por la condicion "s" del scanf)

Si corro tu código me saltan algunos errores

1.- En tu código no declaras las dos funciones, por lo que no las reconoce
2.- La función "printf" pertenece a <stdio.h>, por lo que <iostream> y <stdlib.h> no hacen falta
3.- Estas declarando una variable global (no es error, pero deberías tener cuidado con las variables globales)

Tu código a mi no me compila, he probado con el mio y funciona perfectamente, la salida que me da es esta:

Citar
texto para entrada: a
fin

Espero que te ayude

Saludos


Título: Re: duda con un micro codigo....
Publicado por: engel lex en 25 Junio 2013, 01:52 am
MeCraniDOS: que compilador usas?

Citar
1.- En tu código no declaras las dos funciones, por lo que no las reconoce
2.- La función "printf" pertenece a <stdio.h>, por lo que <iostream> y <stdlib.h> no hacen falta
3.- Estas declarando una variable global (no es error, pero deberías tener cuidado con las variables globales)

1- no las declaro porque las metí antes del main
2- las otras 2 librerias es porque el codigo es más largo, pero vi eso y recorté el código para ver eso y no saqué las otras 2 librerias
por cierto... a mi me corren con <iostream> no con <stdlib.h> si quito stdlib da igual... si quito iostream ni si quierta compila XD

3- esa variable es un simple buffer que metí a los golpes por meter XD


está bien... aqui el codigo arreglado...

Código
  1. #include <iostream>
  2. void entrada();
  3. void salida();
  4. void entrada(){
  5.     char buff[2];
  6.     printf("letra para entrada: ");
  7.     scanf("%s",buff);
  8. }
  9. void salida(){
  10.     printf("fin");
  11. }
  12. int main (){
  13.    entrada();
  14.    salida();
  15.    system("cmd.exe /c pause");
  16.    return 0;
  17. }

la salida sigue siendo
Código:
letra para entrada: a
Presione una tecla para continuar . . .

fin
RUN SUCCESSFUL (total time: 3s)


Título: Re: duda con un micro codigo....
Publicado por: BlackZeroX en 25 Junio 2013, 02:01 am
no, no me entendieron...

lo que estoy no es pidiendo ayuda para hacer el codigo... es solo ese codigo... quiero responder una simple y única pregunta...

¿por qué con el código declarado por mi previamente me imprime el system antes que la salida?

y bueno, agregaré otra pregunta...
¿si uds corren ese código, les pasa lo mismo?


(por cierto, tiene un error el buff es [2] no [1] por la condicion "s" del scanf)

Cuando tu quieres mostrar una cadena o caracter "X" este se plasma en un archivo llamado stdout (funciones como puts() y printf() usan este archivo de manera interna) y solo se muestra dicho texto en la terminal en un momento dado uno de esos momentos son:

Cuando se tiene un salto de linea
Cuando se usa fflush(stdout); fflush(stdout) obliga a mostrar el contenido de stdout en la terminal y por ende vaciar stdout.
Algún otro que fuerce su visualización.

 *  Cuando se visualiza el contenido se "limpia".

Un caso similar en con el archivo stdin que sirve para almacenar lo que se a introducido a la computadora (teclado) y permite obtener y vaciar en cada consulta, gracias a ello existe getchar().

Existe un tercer archivo llamado stderr() que es similar a stdout solo que es orientado a mostrar cadenas errores que a nosotros puede servirnos en la depuración de un programa.

Estos 3 archivos son de tipo FILE*.

Dulces Lunas!¡.


Título: Re: duda con un micro codigo....
Publicado por: engel lex en 25 Junio 2013, 02:03 am
BlackZeroX (Astaroth)

respuesta perfecta con todo lo que necesitaba saber! eso ayuda bastante! de todas formas no espero sino usar cout y cin pero el conocimiento no sobra


Título: Re: duda con un micro codigo....
Publicado por: BlackZeroX en 25 Junio 2013, 02:06 am
Agrego.

<iostream> es de C++ si usas este mejor usa cout, cin y cerr para tus propositos.

http://www.cplusplus.com/reference/istream/iostream/?kw=iostream
http://www.cplusplus.com/reference/istream/

Con cout, cin y cerr para algo similar cout tiene su miembro flush().

Existe uno cuarto llamado clog.

Todo lo que era de ostream tiene su miembro fflush (cout, cerr y clog)

(http://www.cplusplus.com/img/iostream.gif)
Fuente: http://www.cplusplus.com/reference/ios/

Dulces Lunas!¡.


Título: Re: duda con un micro codigo....
Publicado por: rir3760 en 25 Junio 2013, 02:18 am
Una ventaja de utilizar cout y cin es la sincronización de estos: si se utiliza cout para enviar un texto a la salida estándar y a continuación se utiliza cin el bufer del primero se vacía automáticamente.

Un saludo


Título: Re: duda con un micro codigo....
Publicado por: MeCraniDOS en 25 Junio 2013, 10:40 am
MeCraniDOS: que compilador usas?

Uso CodeBlocks con MinGW

Saludos


Editado

Si de la manera en que lo pones te falla, puedes hacerlo también de esta manera, aunque no es la mejor, quizás te funciona...  :-\

Con tu código quedaría así:

Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3. char buff[1];
  4. void entrada(){
  5.     printf("texto para entrada: ");
  6.     scanf("%s",buff);
  7.     salida(); // <-- Usas la funcion salida dentro de la funcion entrada
  8. }
  9. void salida(){
  10.     printf("fin");
  11. }
  12. int main (){
  13.    entrada();
  14.    system("cmd.exe /c pause");
  15.    return 0;
  16. }

Y con mi código quedaría así:

Código
  1. #include <stdio.h>
  2.  
  3. void entrada();
  4. void salida();
  5.  
  6. int main ()
  7. {
  8.    entrada();
  9.  
  10.    fflush(stdin);
  11.    getchar();
  12. }
  13.  
  14. void entrada()
  15. {
  16.    char buff[1];
  17.  
  18.    printf("texto para entrada: ");
  19.    scanf("%s",buff);
  20.  
  21.    salida(); // <-- Usas la funcion salida dentro de la funcion entrada
  22.  
  23. }
  24. void salida()
  25. {
  26.    printf("\nfin");
  27. }


Título: Re: duda con un micro codigo....
Publicado por: amchacon en 25 Junio 2013, 11:23 am
No se debe usar fflush(stdin); es una mala práctica.

Por cierto para la pausa:

Código
  1. system("PAUSE");

Aunque yo personalmente:

Código
  1. puts("Pulse enter para salir");


Título: Re: duda con un micro codigo....
Publicado por: engel lex en 25 Junio 2013, 15:09 pm
Citar
No se debe usar fflush(stdin); es una mala práctica.

Por cierto para la pausa:

Código
system("PAUSE");

Aunque yo personalmente:

Código
puts("Pulse enter para salir");
getchar();

1- Por que fflush es una mala practica?

2- no uso system pause por el compilador, ya eso lo dije...



Título: Re: duda con un micro codigo....
Publicado por: daryo en 25 Junio 2013, 15:26 pm
1. no es estandar fflush stdin lo que se suele usar es flush stdout

2. getchar te corre en cualquier compilador y a todas estas te recomiendo usar mingw como compilador y no cygwin


Título: Re: duda con un micro codigo....
Publicado por: amchacon en 25 Junio 2013, 15:56 pm
1- Por que fflush es una mala practica?
fflush espera un flujo de salida pero stdin es un flujo de entrada (el teclado).

Puede funcionar en determinados sistemas operativos y en determinados compiladores, pero su comportamiento no está definido ni asegurado.

2- no uso system pause por el compilador, ya eso lo dije...
system hace una llamada al sistema, eso es independiente del compilador.