Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Caster en 27 Septiembre 2012, 17:45 pm



Título: [Solucionado] Forma para pausar un programa
Publicado por: Caster en 27 Septiembre 2012, 17:45 pm
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:

Código
  1. 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:

Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.  
  5.    int i;
  6.    char cadena [80];
  7.  
  8.    scanf("%s", cadena);
  9.  
  10.    for (i=0;cadena [i]!='\0';i++);
  11.  
  12.    printf ("\nEl texto tiene %d caracteres.\n",i);
  13.  
  14.  
  15.    getchar();
  16.  
  17.    return 0;
  18. }

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:

Código

O limpiando el bufer de entrada asi:

Código
  1. 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


Título: Re: Forma para pausar un programa
Publicado por: DickGumshoe en 27 Septiembre 2012, 17:49 pm
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.


Título: Re: Forma para pausar un programa
Publicado por: Caster en 27 Septiembre 2012, 17:51 pm
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.


Título: Re: Forma para pausar un programa
Publicado por: DickGumshoe en 27 Septiembre 2012, 17:55 pm
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.


Título: Re: Forma para pausar un programa
Publicado por: Caster en 27 Septiembre 2012, 17:57 pm
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.


Título: Re: Forma para pausar un programa
Publicado por: leosansan en 27 Septiembre 2012, 18:14 pm

Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.  
  5.    int i;
  6.    char cadena [80];
  7.  
  8.    scanf("%s", cadena);
  9.  
  10.    for (i=0;cadena [i]!='\0';i++);
  11.  
  12.    printf ("\nEl texto tiene %d caracteres.\n",i);
  13.    printf ("\nPresione ENTER para salir:");
  14.    while (getchar()!='\n')
  15.        ;
  16.    return 0;
  17. }
Saludos


Título: Re: Forma para pausar un programa
Publicado por: Caster en 27 Septiembre 2012, 18:27 pm
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


Título: Re: Forma para pausar un programa
Publicado por: leosansan en 27 Septiembre 2012, 19:22 pm
Lo he compilado y el programa no se pausa, se cierra.
Citar
Creo 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


Título: Re: Forma para pausar un programa
Publicado por: Caster en 27 Septiembre 2012, 19:26 pm
Lo he copiado exactamente igual que aquí. Sigue sin pararse.

Saludos


Título: Re: Forma para pausar un programa
Publicado por: leosansan en 27 Septiembre 2012, 19:47 pm
Lo he copiado exactamente igual que aquí. Sigue sin pararse.

Citar
Pues 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:
Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.  
  5.    int i;
  6.    char cadena [80];
  7.  
  8.    gets( cadena);
  9.  
  10.    for (i=0;cadena [i]!='\0';i++);
  11.  
  12.    printf ("\nEl texto tiene %d caracteres.\n",i);
  13.    printf ("\nPresione ENTER para salir:");
  14.    while (getchar()!='\n')
  15.        ;
  16.    return 0;
  17. }
Para que no te pase lo del scanf, usalo de este modo ... se come el "\n":
Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.  
  5.    int i;
  6.    char cadena [80];
  7.    scanf("%s%*c", cadena);
  8.    for (i=0;cadena [i]!='\0';i++);
  9.    printf ("\nEl texto tiene %d caracteres.\n",i);
  10.    printf ("\nPresione ENTER para salir:");
  11.    while (getchar()!='\n')
  12.        ;
  13.    return 0;
  14. }
  15.  
Saludos


Título: Re: Forma para pausar un programa
Publicado por: Caster en 27 Septiembre 2012, 22:00 pm
Lo acabo de compilar y funciona perfectamente, duda resuelta. Muchísimas gracias.

Saludos.


Título: Re: Forma para pausar un programa
Publicado por: rir3760 en 28 Septiembre 2012, 02:12 am
Dos comentarios en relaciona los programas de leosansan:

1) Se debe evitar el uso de la función "gets", el porque se explica en el tema |Lo que no hay que hacer en C/C++. Nivel basico| (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html).

2) Es un error utilizar la función "scanf" en esta forma:
Código
  1. scanf("%s%c", cadena);
Ya que la cadena de formato "%s%c" indica que el carácter sera almacenado en la dirección en memoria indicada por el tercer argumento, el problema es que este no existe. En su lugar se debe pasar una dirección de memoria valida o bien utilizar "%*c" para indicar que el carácter sera descartado.

Un saludo


Título: Re: [Solucionado] Forma para pausar un programa
Publicado por: -r3- en 28 Septiembre 2012, 16:52 pm
Creo que el tema ya ha sido solucionado, pero tengo una pregunta, quizás yo esté mal, recién empiezo con C.

En la parte del for(i = 0; cadena != '\0'; ++i);
Por qué pones el punto y coma al final? Según mi libro al final del -for- no debería ir eso.
Código:
#include <stdio.h>

main()
{
int i;
char cadena[80];

scanf("%s", cadena);

for(i = 0; cadena[i] != '\0'; ++i)
printf("Cadena contiene %d caracteres\n", i);

getch();

return 0;
}

Yo lo hice así, lo compilé con gcc para windows y funciona, al final del programa se pausa, aplasto una tecla y finaliza...


Título: Re: [Solucionado] Forma para pausar un programa
Publicado por: xiruko en 28 Septiembre 2012, 17:21 pm
Citar
Creo 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.

:huh:

el ";" no es para nada mas que para acabar el bloque del while sin ninguna sentencia dentro de el.

Código
  1. while(getchar()!='\n');

esto se hace para limpiar el bufer de entrada stdin. se ha comentado muchas veces en el foro pero lo repetire una vez mas. funciones como scanf() dejan basura en el bufer de entrada. si lo usas para leer un entero, e introduces por ejemplo "23ab", scanf() leera el "23" y el "ab\n" se quedara en el bufer de entrada. usando esta sentencia del while, limpias el bufer ya que descarta los caracteres hasta encontrarse el de salto de linea, el cual tambien lo descarta. asi luego puedes usar otras funciones como fgets() sin problemas.

Citar
En la parte del for(i = 0; cadena != '\0'; ++i);
Por qué pones el punto y coma al final? Según mi libro al final del -for- no debería ir eso.

es el mismo caso que antes. cuando el for tiene sentencias dentro de el se usan "{}", en cambio si no tiene ninguna sentencia dentro tienes que indicar de alguna manera que el for se acaba, y se hace con ";". de hecho, tambien podrias hacerlo asi:

Código
  1. for(i=0; cadena!='\0'; i++){}

o incluso asi:

Código
  1. for(i=0; cadena!='\0'; i++){};

y todas funcionarian.

un saludo!


Título: Re: [Solucionado] Forma para pausar un programa
Publicado por: Caster en 28 Septiembre 2012, 23:17 pm
Añado algo:

Es recomendable usar esto:

Código
  1. while (getchar()!='\n')
  2.        ;
  3.  

Despues de cada scanf para limpiar siempre el bufer.

Aunque para evitart tener que cargar mucho el codigo de esto, es mejor aprender a utilizar otras funciones como por ejemplo: fgets().

Saludos