Ayuda con trozo codigo de "quiere continuar s/n"..

Iniciado por samis101, 6 Diciembre 2018, 00:38 AM

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

samis101

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;

  }

AlbertoBSD

#1
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


entrar_opcion_si_no = 1;
do{
printf("Desea segir ingresando mas datos? (s/n)\n");
fgets(temp,10,stdin);
switch(tolower(temp[0])) {
case 's':
entrar_opcion_si_no = 0;
printf("Selecciono SI\n");
break;
case 'n':
entrar_opcion_si_no = 0;
printf("Selecciono NO\n");
entrar = 0; // Se cambia la variable para salir del menu principal
break;
default:
printf("opcion incorrecta, solo 's' o 'n'\n");
break;
}
}while(entrar_opcion_si_no == 1);


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:



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.


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

int main() {
char frase[50], frase2[50];
char temp[10];
int entrar = 1;
int  i=0,entrar_opcion_si_no;
do {
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");
printf("Ingrese frase 1 maximo 50 caracteres \n");
fgets(frase,50,stdin);
fseek(stdin, 0, SEEK_END);
frase[strcspn(frase,"\n\r")] = '\0';
printf("Ingrese frase 2 maximo 50 caracteres \n");
fgets(frase2,50,stdin);
fseek(stdin, 0, SEEK_END);
frase2[strcspn(frase2,"\n\r")] = '\0';

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

if (strcmp(frase,frase2)==0) {
printf("La frase 1 \"%s\" es IGUAL a la frase 2 \"%s\"",frase, frase2);
printf(" y la frase 2 esta dentro de la frase 1");
}
else {
printf("La frase 1 \"%s\" es DIFERENTE a lab frase 2 \"%s\"\n",frase, frase2);
if (strcmp (frase,frase2)>0)
printf("La frase 1 es MAYOR que la frase 2\n");
else
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");
}

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

entrar_opcion_si_no = 1;
do{
printf("Desea segir ingresando mas datos? (s/n)\n");
fgets(temp,10,stdin);
switch(tolower(temp[0])) {
case 's':
entrar_opcion_si_no = 0;
printf("Selecciono SI\n");
break;
case 'n':
entrar_opcion_si_no = 0;
printf("Selecciono NO\n");
entrar = 0; // Se cambia la variable para salir del menu principal
break;
default:
printf("opcion incorrecta, solo 's' o 'n'\n");
break;
}
fseek(stdin, 0, SEEK_END);
}while(entrar_opcion_si_no == 1);
}while(entrar);
return 0;
}


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

samis101

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

SDCC

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

printf("Ingrese frase 1 maximo 50 caracteres \n");
fgets(frase,50,stdin);
fseek(stdin, 0, SEEK_END);
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.

AlbertoBSD

#4
Cita de: SDCC en  6 Diciembre 2018, 07:15 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.

Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW