duda con un micro codigo....

Iniciado por engel lex, 25 Junio 2013, 01:12 AM

0 Miembros y 2 Visitantes están viendo este tema.

engel lex

tengo

Código (cpp) [Seleccionar]
#include <iostream>
#include <stdlib.h>
char buff[1];
void entrada(){
    printf("texto para entrada: ");
    scanf("%s",buff);
}
void salida(){
    printf("fin");
}
int main (){
   entrada();
   salida();
   system("cmd.exe /c pause");
   return 0;
}


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

lo lógico es que la salida sea

texto para entrada: a
fin
Presione una tecla para continuar . . .

(la "a" es el valor que ingreso)

pero la salida real es

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?
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

BlackZeroX

#1
Usa fflush(stdout) así:



void salida(){
    printf("fin");
    fflush(stdout);
}



Si no ocupas parametros usa puts();



void salida(){
    puts("fin");
}



o termina la cadena con un salto de linea



void salida(){
    printf("fin\n");
}



Dulces Lunas!¡.
The Dark Shadow is my passion.

MeCraniDOS

Y ese código no te da errores...?

Prueba con este:


Código (cpp) [Seleccionar]
#include <stdio.h>

void entrada();
void salida();

int main ()
{
    entrada();

    salida();

    fflush(stdin);
    getchar();
}

void entrada()
{
    char buff[1];

    printf("texto para entrada: ");
    scanf("%s",buff);

}
void salida()
{
    printf("\nfin");
}


Saludos
"La física es el sistema operativo del Universo"
     -- Steven R Garman

engel lex

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)
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

MeCraniDOS

Cita de: engelx en 25 Junio 2013, 01:34 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:

Citartexto para entrada: a
fin

Espero que te ayude

Saludos
"La física es el sistema operativo del Universo"
     -- Steven R Garman

engel lex

MeCraniDOS: que compilador usas?

Citar1.- 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 (cpp) [Seleccionar]
#include <iostream>
void entrada();
void salida();
void entrada(){
     char buff[2];
     printf("letra para entrada: ");
     scanf("%s",buff);
}
void salida(){
     printf("fin");
}
int main (){
    entrada();
    salida();
    system("cmd.exe /c pause");
    return 0;
}


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

fin
RUN SUCCESSFUL (total time: 3s)
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

BlackZeroX

#6
Cita de: engelx 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)

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!¡.
The Dark Shadow is my passion.

engel lex

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
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

BlackZeroX

#8
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)


Fuente: http://www.cplusplus.com/reference/ios/

Dulces Lunas!¡.
The Dark Shadow is my passion.

rir3760

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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language