elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda con trozo codigo de "quiere continuar s/n"..
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con trozo codigo de "quiere continuar s/n"..  (Leído 1,438 veces)
samis101

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Ayuda con trozo codigo de "quiere continuar s/n"..
« en: 6 Diciembre 2018, 00:38 am »

hola, una ayudita, primero decir que hace 3 semanas que estoy con programacion C y el codigo puede que no sea del todo "bonito"..

El codigo compila perfecto, se ejecuta sin problemas hace todo lo que tendria que hacer, el problema se genera cuando llega al final y pregunta que si queremos hacer nuevamente el proceso o no... lo hace bien si ponemos "s" peroooo y ahi esta el problema el programa vuelve a comenzar pero pidiendo la segunda frase o sea frase2, se salta la entrada de frase..

Me pasa en otros programas exactamente igual, ya probe de todo, cambiar los scanf por getstodos.. los gets x scanf, con %s con una tipo funcion rara de %[^\n] o algo asi que nosdijo elprofesor pero nada sigue haciendo lo mismo, y la verdad el profe no me parece que controle mucho de C porque el tampoco encuentra solucion... a ver si no esalguna tonteria jaja...

gracias por la ayuda....




#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>

// ejercicio de cadenas
// pag 214 libro
// Pruebas de srtsrt y srtcmp

int main()

{
char frase[50], frase2[50];
char opcion;
int  i=0;

printf("\n\n\n\n\n\t ANTES DE CONTINUAR .........");
printf("\n\n\n\n\n\t                   FAVOR MAXIMIZAR LA PANTALLA DE EJECUCION DE C .........\n\n\n\n");
printf("\n\n\n\n\n .............");
system("pause");

do
{
system("cls");
printf("\n\n\n <<<  PROGRAMA PIDE 2 FRASES, PRIMERO LAS COMPARA A VER SI SON IGUALES, LUEGO BUSCA LA SEGUNDA DENTRO DE LA PRIMERA Y POR ULTIMO NOS DICE CUAL ES MAYOR >>>");
printf("\n\n\n\n\t Ingrese frase 1 maximo 50 caracteres \n\n ");
gets(frase);
puts("");puts("");

printf("\n\n\n\n\t Ingrese frase 2 maximo 50 caracteres \n\n ");
gets(frase2);
puts("");puts("");

printf("\n\n Primero vamos a compararlas si son iguales o no ...\n\n");
system("pause");

if (strlen(frase)>50 || strlen(frase2)>50)
    {
     printf("\n\n\n OJO!!! frase con mas de 50 caracteres, solo analiza dentro de los primeros 50 \n\n\n");
     system ("pause");
    }
if (strcmp(frase,frase2)==0)
   {
      printf("\n\n La frase 1 \"%s\" es IGUAL a la frase 2 \"%s\"",frase, frase2);
      printf("\n y la frase 2 esta dentro de la frase 1");
   }
else
   {  printf("\n\n La frase 1 \"%s\" es DIFERENTE a lab frase 2 \"%s\"",frase, frase2);
      if (strcmp (frase,frase2)>0)
         {  printf("\n\n La frase 1 es MAYOR que la frase 2");  }
      else
         {  printf("\n\n La frase 1 es MENOR que la frase 2 oooooo la frase2 MAYOR que la frase1.. como quieras vaso medio lleno vaso medio vacio jejeje ");  }
   }

if (strstr(frase,frase2)==NULL)
    {  printf("\n\n La frase 2 NO esta incluida en la frase 1..");  }
else
    {  printf("\n\n La frase 2 SI esta incluida en la frase 1..");  }

fflush(stdin);
printf("\n\n\n\n   Quiere hacer mas comparaciones ? s/n - ");
scanf (" %c",&opcion);
}
while (opcion=='s' || opcion=='S');


puts("");puts("");puts("");
return 0;

  }


En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Ayuda con trozo codigo de "quiere continuar s/n"..
« Respuesta #1 en: 6 Diciembre 2018, 00:48 am »

Tu problema principal es que todavia quedan datos en el buffer de entrada, te recomiendo que leas
¿Queda algo en el Buffer de Entrada stdin? (Solucionado)


Utiliza las etiqutas para codigo

Código
  1. entrar_opcion_si_no = 1;
  2. do{
  3. printf("Desea segir ingresando mas datos? (s/n)\n");
  4. fgets(temp,10,stdin);
  5. switch(tolower(temp[0])) {
  6. case 's':
  7. entrar_opcion_si_no = 0;
  8. printf("Selecciono SI\n");
  9. break;
  10. case 'n':
  11. entrar_opcion_si_no = 0;
  12. printf("Selecciono NO\n");
  13. entrar = 0; // Se cambia la variable para salir del menu principal
  14. break;
  15. default:
  16. printf("opcion incorrecta, solo 's' o 'n'\n");
  17. break;
  18. }
  19. }while(entrar_opcion_si_no == 1);
  20.  

Otra cosa, se que estas empezado, pero como recomendacion deja de utlizar funciones fancy ( funciones de adorno ) y concentrate en aprender las estrucutras basicas

Es decir quita todo esto:

Código:

printf("\n\n\n\n\n\t ANTES DE CONTINUAR .........");
printf("\n\n\n\n\n\t                   FAVOR MAXIMIZAR LA PANTALLA DE EJECUCION DE C .........\n\n\n\n");
printf("\n\n\n\n\n .............");
system("pause");
system("cls");

Y tambien deja de utilizar conio.h no es una libreria estandar


Me tome la molestia de re-escribir tu programa con varia modificaciones.

Código
  1. #include<stdio.h>
  2. #include<ctype.h>
  3. #include<string.h>
  4. #include<stdlib.h>
  5.  
  6. int main() {
  7. char frase[50], frase2[50];
  8. char temp[10];
  9. int entrar = 1;
  10. int  i=0,entrar_opcion_si_no;
  11. do {
  12. printf("PROGRAMA PIDE 2 FRASES, PRIMERO LAS COMPARA A VER SI SON IGUALES, LUEGO BUSCA LA SEGUNDA DENTRO DE LA PRIMERA Y POR ULTIMO NOS DICE CUAL ES MAYOR\n");
  13. printf("Ingrese frase 1 maximo 50 caracteres \n");
  14. fgets(frase,50,stdin);
  15. fseek(stdin, 0, SEEK_END);
  16. frase[strcspn(frase,"\n\r")] = '\0';
  17. printf("Ingrese frase 2 maximo 50 caracteres \n");
  18. fgets(frase2,50,stdin);
  19. fseek(stdin, 0, SEEK_END);
  20. frase2[strcspn(frase2,"\n\r")] = '\0';
  21.  
  22. printf("Primero vamos a compararlas si son iguales o no ...\n");
  23.  
  24. if (strcmp(frase,frase2)==0) {
  25. printf("La frase 1 \"%s\" es IGUAL a la frase 2 \"%s\"",frase, frase2);
  26. printf(" y la frase 2 esta dentro de la frase 1");
  27. }
  28. else {
  29. printf("La frase 1 \"%s\" es DIFERENTE a lab frase 2 \"%s\"\n",frase, frase2);
  30. if (strcmp (frase,frase2)>0)
  31. printf("La frase 1 es MAYOR que la frase 2\n");
  32. else
  33. printf("La frase 1 es MENOR que la frase 2 oooooo la frase2 MAYOR que la frase1.. como quieras vaso medio lleno vaso medio vacio jejeje\n");
  34. }
  35.  
  36. if (strstr(frase,frase2)==NULL)
  37. printf("La frase 2 NO esta incluida en la frase 1\n");
  38. else
  39. printf("La frase 2 SI esta incluida en la frase 1\n");  
  40.  
  41. entrar_opcion_si_no = 1;
  42. do{
  43. printf("Desea segir ingresando mas datos? (s/n)\n");
  44. fgets(temp,10,stdin);
  45. switch(tolower(temp[0])) {
  46. case 's':
  47. entrar_opcion_si_no = 0;
  48. printf("Selecciono SI\n");
  49. break;
  50. case 'n':
  51. entrar_opcion_si_no = 0;
  52. printf("Selecciono NO\n");
  53. entrar = 0; // Se cambia la variable para salir del menu principal
  54. break;
  55. default:
  56. printf("opcion incorrecta, solo 's' o 'n'\n");
  57. break;
  58. }
  59. fseek(stdin, 0, SEEK_END);
  60. }while(entrar_opcion_si_no == 1);
  61. }while(entrar);
  62. return 0;
  63. }
  64.  

Le quite la condición donde evalúas si son mayores a 50 de longitud, ya que con fgets limitas eso:


« Última modificación: 6 Diciembre 2018, 01:45 am por AlbertoBSD » En línea

samis101

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: Ayuda con trozo codigo de "quiere continuar s/n"..
« Respuesta #2 en: 6 Diciembre 2018, 02:09 am »

Gracias por la info alberto, voy a ler la info del enlace, y si lo de los adornos lo se jejeje pero es que el resto de la clase va mas lento y me aburro y relleno el codigo con lo que se me ocurre ...

gracias.. saludos
En línea

SDCC

Desconectado Desconectado

Mensajes: 55


Ver Perfil
Re: Ayuda con trozo codigo de "quiere continuar s/n"..
« Respuesta #3 en: 6 Diciembre 2018, 07:15 am »

Disculpa alberto,viendo tu programa que proporcionaste me surgio la siguiente duda en el ingreso de cadenas...

Código
  1. printf("Ingrese frase 1 maximo 50 caracteres \n");
  2. fgets(frase,50,stdin);
  3. fseek(stdin, 0, SEEK_END);
  4. frase[strcspn(frase,"\n\r")] = '\0';
Entiendo como lees la cadena sin embargo me surge una duda en el uso de fseek...Tengo entendido que en este ejemplo en especifico lo que hace la funcion fseek es posicionar el indicador de la entrada estandar hasta al final de manera que si se ingreso mas de 50 caracteres estos quedaran atras del indicador y ya no abra problema al yo volver a leer valores de stdin sin embargo si el programa es un poco mas grandes ¿es posible que surga un desbordamiento del buffer ? debido a que realmente no se esta limpiando el buffer ,en caso de que asi sea ¿cual seria la mejor solución?,conozco la funcion fflush pero tengo entendido que puede que su funcionamiento no siempre sea el esperado.
En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Ayuda con trozo codigo de "quiere continuar s/n"..
« Respuesta #4 en: 6 Diciembre 2018, 07:28 am »

conozco la funcion fflush pero tengo entendido que puede que su funcionamiento no siempre sea el esperado.

Con fgets no hay riesgo de overflow mientras especifiques un numero de lectura igual o inferior al tamaño del buffer. Pero como lo mencionas si el usuario ingresa mas datos estos quedaran en el buffer, lo cual afectaría a las próximas funciones que lean datos

Exactamente, vimos que fseek funciona para sustituir fflush. Segun lo discutimos en: ¿Queda algo en el Buffer de Entrada stdin? (Solucionado)

Es eso o detectar si queda algo en el buffer de stdin analizando lo devuelto por fgets, esto es si el buffer de destino indicado por fgets contiene el retorno de linea significa que ya no queda nada en el stdin y podemos leer el siguiente dato sin problema.

« Última modificación: 6 Diciembre 2018, 07:30 am por AlbertoBSD » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines