Autor
|
Tema: Ayuda con trozo codigo de "quiere continuar s/n".. (Leído 1,728 veces)
|
samis101
Desconectado
Mensajes: 2
|
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
Mensajes: 3.705
🏴 Libertad!!!!!
|
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"); case 's': entrar_opcion_si_no = 0; break; case 'n': entrar_opcion_si_no = 0; 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"); fseek(stdin , 0, SEEK_END ); frase [strcspn(frase ,"\n\r")] = '\0'; printf("Ingrese frase 2 maximo 50 caracteres \n"); 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 ); 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"); case 's': entrar_opcion_si_no = 0; break; case 'n': entrar_opcion_si_no = 0; 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:
|
|
« Última modificación: 6 Diciembre 2018, 01:45 am por AlbertoBSD »
|
En línea
|
|
|
|
samis101
Desconectado
Mensajes: 2
|
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
Mensajes: 55
|
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"); 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.
|
|
|
En línea
|
|
|
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
|
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
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[Ayuda] modificar "start page" en "internet explorer" con "batch"
Scripting
|
taton
|
7
|
17,378
|
20 Septiembre 2006, 01:45 am
por taton
|
|
|
recursos visual basic, """"""proceso inmortal"""""
Análisis y Diseño de Malware
|
Dark4ngel
|
7
|
14,264
|
3 Noviembre 2011, 10:42 am
por Dark4ngel
|
|
|
La Operacion en varios pasos genero errores... AYUDA AQUI"""""
Programación Visual Basic
|
JoseCheO
|
1
|
8,153
|
23 Diciembre 2011, 16:57 pm
por JoseCheO
|
|
|
Ayuda con Código "Simple en C" Hacer que solo se ingresen numeros
« 1 2 3 »
Programación C/C++
|
ZedGe
|
25
|
13,098
|
30 Diciembre 2011, 23:11 pm
por rir3760
|
|
|
Ayuda para compilar este código C en Linux (error referencia a "" sin definir)
Programación C/C++
|
ShadowA7X
|
1
|
12,026
|
13 Noviembre 2015, 19:18 pm
por ShadowA7X
|
|