Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Itsrecordbaby en 1 Febrero 2023, 01:28 am



Título: Tengo un programa que no funciona como quiero
Publicado por: Itsrecordbaby en 1 Febrero 2023, 01:28 am
Tengo que hacer un programa que identifique se una frase es palindroma (que se lee igual de izquierda a derecha que de derecha a izquierda) la parte de verificar si es palindromo funciona pero me pidieron que le agregue un menu, lo intente y no me deja ingresar la frase y se manda de nuevo a al menu. ayuda pliss:


Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>
  4.  
  5. void comprobarPalindromo() {
  6.  char pal[40], pal2[40];
  7.  int n, i, j, flag = 1;
  8.  printf("Por favor, introduce una palabra o frase para verificar si es palindroma: \n");
  9.  fgets(pal, 40, stdin);
  10.  n = strlen(pal);
  11.  j = 0;
  12.  for (i = 0; i < n; i++) {
  13.    if (isalnum(pal[i])) {
  14.      pal2[j++] = tolower(pal[i]);
  15.    }
  16.  }
  17.  pal2[j] = '\0';
  18.  for (i = 0; i < j / 2; i++) {
  19.    if (pal2[i] != pal2[j - i - 1]) {
  20.      flag = 0;
  21.      break;
  22.    }
  23.  }
  24.  if (flag) {
  25.    printf("Felicidades, escribiste un palindromo :)\n");
  26.  } else {
  27.    printf("No escribiste un palindromo :(\n");
  28.  }
  29. }
  30.  
  31. int main() {
  32.  int opcion;
  33.  do {
  34.    printf("\nMenu del proyecto palindromo\n");
  35.    printf("1. Integrantes\n");
  36.    printf("2. Comprobar si es o no palindromo\n");
  37.    printf("3. Salir\n");
  38.    printf("Seleccione una opcion: ");
  39.    scanf("%d", &opcion);
  40.    switch (opcion) {
  41.      case 1:
  42.        printf("Mauricio Mora,Andres Calle\n");
  43.        break;
  44.      case 2:
  45.        printf("Comprobar si es o no palindromo\n");
  46.        comprobarPalindromo();
  47.        break;
  48.      case 3:
  49.        printf("Saliendo...\n");
  50.        break;
  51.      default:
  52.        printf("Opcion Invalida\n");
  53.        break;
  54.    }
  55.  } while (opcion != 3);
  56.  return 0;
  57. }


Título: Re: Tengo un programa que no funciona como quiero
Publicado por: fary en 1 Febrero 2023, 08:31 am
Cuando lees con scanf se deja el enter en el buffer de entrada y cuando llamas a fgets lo recoge del buffer, por eso nunca llegas a leer la cadena.

Limpia el buffer de entrada con fflush. Tu código funcional:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>
  4.  
  5. void comprobarPalindromo() {
  6.  char pal[40], pal2[40];
  7.  int n, i, j, flag = 1;
  8.  
  9.  printf("Por favor, introduce una palabra o frase para verificar si es palindroma: \n");
  10.  fgets(pal, 40, stdin);
  11.  
  12.  n = strlen(pal);
  13.  j = 0;
  14.  for (i = 0; i < n; i++) {
  15.    if (isalnum(pal[i])) {
  16.      pal2[j++] = tolower(pal[i]);
  17.    }
  18.  }
  19.  pal2[j] = '\0';
  20.  for (i = 0; i < j / 2; i++) {
  21.    if (pal2[i] != pal2[j - i - 1]) {
  22.      flag = 0;
  23.      break;
  24.    }
  25.  }
  26.  if (flag) {
  27.    printf("Felicidades, escribiste un palindromo :)\n");
  28.  } else {
  29.    printf("No escribiste un palindromo :(\n");
  30.  }
  31. }
  32.  
  33. int main() {
  34.  int opcion;
  35.  do {
  36.    printf("\nMenu del proyecto palindromo\n");
  37.    printf("1. Integrantes\n");
  38.    printf("2. Comprobar si es o no palindromo\n");
  39.    printf("3. Salir\n");
  40.    printf("Seleccione una opcion: ");
  41.    scanf("%d", &opcion);
  42.  
  43.    fflush(stdin);  //<---------AQUI LIMPIAS EL BUFFER STDIN.
  44.  
  45.    switch (opcion) {
  46.      case 1:
  47.        printf("Mauricio Mora,Andres Calle\n");
  48.        break;
  49.      case 2:
  50.        printf("Comprobar si es o no palindromo\n");
  51.        comprobarPalindromo();
  52.        break;
  53.      case 3:
  54.        printf("Saliendo...\n");
  55.        break;
  56.      default:
  57.        printf("Opcion Invalida\n");
  58.        break;
  59.    }
  60.  } while (opcion != 3);
  61.  return 0;
  62. }


Título: Re: Tengo un programa que no funciona como quiero
Publicado por: RayR en 1 Febrero 2023, 16:55 pm
Es cierto que el problema se resuelve limpiando el buffer, pero fflush(stdin) no es lo correcto. Esta función sólo sirve para buffers de salida, no de entrada, como stdin. Usarlo con stdin funciona de casualidad en Windows, siempre que uses MinGW. Si usas, por ejemplo, alguna versión reciente de Visual C++, no funciona, y tampoco sirve en Linux, independientemente del compilador. Como se trata de un ejercicio simple y no estás validando entrada ni verificando errores, puedes limpiar el buffer con esta línea después del scanf:

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