[Solucionado] Forma para pausar un programa

Iniciado por Caster, 27 Septiembre 2012, 17:45 PM

0 Miembros y 1 Visitante están viendo este tema.

Caster

Pues haciendo algunos programas tontos para coger practica me ha surgido una duda, mil veces en el foro han dicho que llamar al sistema para realizar una pausa es una mala practica:

system("PAUSE");

Y yo como bueno aprendiz que soy  :xD hago caso, intento evitarla.

acabo de hacer este programa desde cero yo solo, solo por aburrimiento:

#include <stdio.h>

int main() {
   
   int i;
   char cadena [80];
   
   scanf("%s", cadena);
   
   for (i=0;cadena [i]!='\0';i++);
                 
   printf ("\nEl texto tiene %d caracteres.\n",i);


   getchar();
   
   return 0;
}


El programa funciona pefectamente, el problema es que al final no se para, y la unica forma que se me ocurre es poniendo dos veces la linea:

getchar();

O limpiando el bufer de entrada asi:

fflush(stdin);

Pero es que tambien he leido muchas veces que limpiar el bufer de esa manera tambien es una mala practica porque puede comportarse de forma erronea. Entonces queria saber la forma correcta y limpia para parar el programa, no solo ese, sino tambien otro cualquiera.

Saludos

DickGumshoe

Personalmente, me gusta usar dos veces getchar(). El primero para limpiar el buffer y el segundo para pausar el programa. Sí, la función no está hecha específicamiente para limpiar el buffer, pero me gusta más que fflush(stdin) y cumple bien con lo que quieres hacer.

Un saludo.

Caster

Cumple la función si, y yo también lo prefiero antes que la otra opción, pero yo lo que busco es algo específicamente para eso, y si no lo hay, pues tendré que usarlo de esa manera.

Saludos.

DickGumshoe

Pues a parte de system("PAUSE") no hay más funciones específicas para pausar el programa.

Otra solución a parte de la de getchar() es usar un IDE que pause solo el programa (Codeblocks es uno de los que conozco que hace esto).

Un saludo.

Caster

Yo es que uso el Sublime Text 2 para escribir el código y después compilo por consola con MinGW.

¿Estás seguro de que no existen otras funciones?

Saludos.

leosansan

Cita de: Caster en 27 Septiembre 2012, 17:45 PM

#include <stdio.h>

int main() {
   
    int i;
    char cadena [80];
   
    scanf("%s", cadena);
   
    for (i=0;cadena [i]!='\0';i++);
                 
    printf ("\nEl texto tiene %d caracteres.\n",i);
    printf ("\nPresione ENTER para salir:");
    while (getchar()!='\n')
        ;
    return 0;
}

Saludos

Caster

Lo he compilado y el programa no se pausa, se cierra. Creo que esto ocurre porque para introducir la cadena de caracteres hay que presionar enter, entonces queda guardado en el bufer como salto de linea y al ejecutarse el bucle while automáticamente ya sale.

Aunque no funcione este el tipo de solución que yo buscaba, gracias.

Saludos

leosansan

Cita de: Caster en 27 Septiembre 2012, 18:27 PM
Lo he compilado y el programa no se pausa, se cierra.
CitarCreo que no te has fijado bien en el punto y coma ";" después del while. Este es el que "obliga" al programa a esperar el ENTER para cerrar.
Saludos

Caster

Lo he copiado exactamente igual que aquí. Sigue sin pararse.

Saludos

leosansan

#9
Cita de: Caster en 27 Septiembre 2012, 19:26 PM
Lo he copiado exactamente igual que aquí. Sigue sin pararse.

CitarPues no lo entiendo. Lo he probado en Code::Blocks, en Dev-C++ y en Pelles C y en todos funciona.
Ahora lo entiendo, estaba usando gets en lugar de scanf:
#include <stdio.h>

int main() {

   int i;
   char cadena [80];

   gets( cadena);

   for (i=0;cadena [i]!='\0';i++);

   printf ("\nEl texto tiene %d caracteres.\n",i);
   printf ("\nPresione ENTER para salir:");
   while (getchar()!='\n')
       ;
   return 0;
}

Para que no te pase lo del scanf, usalo de este modo ... se come el "\n":
#include <stdio.h>

int main() {

   int i;
   char cadena [80];
   scanf("%s%*c", cadena);
   for (i=0;cadena [i]!='\0';i++);
   printf ("\nEl texto tiene %d caracteres.\n",i);
   printf ("\nPresione ENTER para salir:");
   while (getchar()!='\n')
       ;
   return 0;
}

Saludos