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

 

 


Tema destacado: AIO elhacker.NET 2021 Compilación herramientas análisis y desinfección malware


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con comparar cadenas
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con comparar cadenas  (Leído 2,368 veces)
Jay

Desconectado Desconectado

Mensajes: 26


Ver Perfil
Problema con comparar cadenas
« en: 26 Abril 2021, 18:29 pm »

Hola tengo una duda al final quiero comaprar las cadenas lenguaje con cadena pero me dice que no es igual no tengo idea por que es, otra duda es en que en el do while no lo toma en cuenta para volver a a comparar es decir si le das a la opcion 1 no repite el proceso

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include<time.h>
  4. #include<stdlib.h>
  5. #include<ctype.h>
  6. #include <unistd.h>
  7.  
  8.  
  9. int subCadena(char *cad, char *subCad, int ini, int fin)
  10. {
  11.    int iC, iS;
  12.  
  13.    if((ini>fin)|| (ini<0) || (fin>=strlen(cad)))
  14.        return 0;
  15.  
  16.    iS = 0;
  17.    for (iC = ini; iC<=fin; iC+=10){
  18.        subCad[iS] = cad[iC];
  19.        iS++;
  20.    }
  21.  
  22.    subCad[iS] = '\0';
  23.  
  24.    return 1;
  25.  
  26. }
  27.  
  28.  
  29. char *invertir(char cadena[]) {
  30.  int longitud = strlen(cadena);
  31.  char temporal;
  32.  for (int izquierda = 0, derecha = longitud - 1; izquierda < (longitud / 2);
  33.       izquierda++, derecha--) {
  34.    temporal = cadena[izquierda];
  35.    cadena[izquierda] = cadena[derecha];
  36.    cadena[derecha] = temporal;
  37.  }
  38.  return cadena;
  39. }
  40.  
  41. char *strstr(const char *haystack, const char *needle);
  42.  
  43. int strcmp(const char * s1,const char * s2);
  44.  
  45. int main()
  46.  
  47. {
  48.  
  49. srand(time(NULL));
  50. int n = 1 + rand()% (3 - 1);
  51. int n3;
  52. int op;
  53. int n2 = n*2;
  54. char *alfabeto = "1599024 jonathan adrian gutierrez alvarado";
  55. char i[7];
  56. char w[10];
  57. char winv[8];
  58. char j[16];
  59. char cadena[30];
  60. char lenguaje[40];
  61. char fraseN[sizeof(w) * n+1];
  62.    strcpy(fraseN, w);
  63. char fraseM[sizeof(winv) * n2];
  64.    strcpy(fraseM,winv);
  65.  
  66. printf("El Alfabeto es: %s\n", alfabeto);
  67.  
  68. strncpy(i,&alfabeto[0],7);
  69.   i[7] = '\0';
  70.  
  71. strncpy(j,&alfabeto[8],16);
  72.   j[8] = '\0';
  73.  
  74. if(subCadena(alfabeto,w,24,35) == 0){
  75.  
  76.        printf("Error");
  77.    }
  78.  
  79. if(subCadena(alfabeto,winv,24,35) == 0){
  80.  
  81.        printf("Error");
  82.    }
  83.  
  84.  
  85.        for(int i = 0; i < n; ++i){
  86.                strcat(fraseN, w);
  87.            }
  88.        for(int i = 0; i < n2; ++i){
  89.                strcat(fraseM, winv);
  90.            }
  91.  
  92.        strcat(lenguaje, i);
  93.        strcat(lenguaje, fraseN);
  94.        strcat(lenguaje, i);
  95.        strcat(lenguaje, invertir(fraseM));
  96.        strcat(lenguaje, j);
  97.        strcat(lenguaje, j);
  98.        printf("\nEste es el lenguaje: %s\n", lenguaje);
  99.  
  100.  
  101. do{
  102.   printf("\nIntroduce la cadena a verificar: \n");
  103.        gets(cadena);
  104.  
  105.        if (strcmp(lenguaje, cadena)== 0) {
  106.            printf("\nSon iguales", cadena);
  107.            } else {
  108.                printf("\nNo son iguales", cadena);
  109.            }
  110.        printf("\nDesea introducir otra cadena: \n1) SI \n2)NO\n");
  111.        scanf("%d", &op);
  112.  
  113. }while(op < 2);
  114.  
  115.  
  116.  
  117.    system("\n pause");
  118. }
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  


« Última modificación: 26 Abril 2021, 18:45 pm por K-YreX » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Problema con comparar cadenas
« Respuesta #1 en: 28 Abril 2021, 18:52 pm »

Entiendo que cuándo eliges sí el problema es que no te pide otra cadena.

Cambia la cadena del scanf  de la selección por
Código:
scanf("%d%*c", &op);

Un asterisco después del % hace que se consuma esa entrada pero no la cargue en ninguna variable. En este caso se consume el último carácter que es el '\n' del return. Si no lo haces se queda en la caché del teclado y el siguiente scanf (que en tu caso pide una nueva cadena) encuentra el carácter de nueva línea y lo carga en la variable.


En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Problema con comparar cadenas
« Respuesta #2 en: 28 Abril 2021, 21:04 pm »

Hola tengo una duda al final quiero comaprar las cadenas lenguaje con cadena pero me dice que no es igual no tengo idea por que es
El problema con las cadenas es el siguiente:
Código
  1. const int MAX_SIZE = 20;
  2.  
  3. int main() {
  4.  char *cadena1 = "hola"; // Se guarda "hola\0" -> '\0' es el caracter de fin de cadena siempre
  5.  char cadena2[MAX_SIZE];
  6.  // fgets() es la recomendacion sobre gets() para evitar problemas de desbordamiento
  7.  fgets(cadena2, MAX_SIZE, stdin); // Introduces: "hola" y pulsas Enter '\n' -> Se guarda: "hola\n\0"
  8.  if(strcmp(cadena1, cadena2) == 0) { // "hola\0" y "hola\n\0" no son iguales
  9.    ...
  10.  }
  11. }

Una solución que me gusta usar porque además de eliminar el Enter del final también deja el buffer limpio es:
Código
  1. fgets(cadena2, MAX_SIZE, stdin);
  2. if(cadena2[strlen(cadena2) - 1] == '\n') // Si el ultimo caracter de la cadena es Enter -> No queda nada en el buffer...
  3.  cadena2[strlen(cadena2) - 1] = '\0'; // ...y elimino el Enter sustituyendolo por el caracter de fin de cadena
  4. else // Si el ultimo caracter de la cadena no es Enter -> No cabia en el array y se ha quedado en el buffer (solo o con otros caracteres antes)
  5.  while(getchar() != '\n'); // Consumo todos los caracteres del buffer hasta consumir el Enter que va a ser el ultimo -> Buffer limpio
Así consigues que la cadena siempre quede sin el Enter al final y el buffer siempre quede limpio.

Otra posible solución es comparar hasta el final de la cadena que no tiene el Enter, así no lo tendrás en cuenta:
Código
  1. if(strncmp(cadena1, cadena2, strlen(cadena1)) == 0) {
  2.  ...
  3. }
Inconvenientes:
  • Tienes que controlar manualmente cuál será la cadena que no tenga el Enter.
  • Cuando utilices la cadena2 para otra cosa, seguirá teniendo el Enter y tendrás que acordarte de manejarlo correctamente.

Además la opción del:
Código
  1. while(getchar() != '\n');
también sirve como método después de un scanf() para dejar el buffer limpio. Esto sería una alternativa a la respuesta de MAFUS para que la siguiente entrada funcione correctamente.
Además si pides un número "%d" y el usuario introduce letras, el bucle se encargará de dejar limpio el buffer eliminando todas las letras que no se hayan podido procesar en la entrada.
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Problema con comparar cadenas
« Respuesta #3 en: 29 Abril 2021, 11:03 am »

En según qué construcciones a mi me gusta usar la función fseek después de un scanf:

Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.    char str[1024];
  5.    printf("> ");
  6.    scanf("%1024[^\n]", str);
  7.    printf("%s\n", str);
  8.  
  9.    fseek(stdin, 0, SEEK_END);
  10.  
  11.    puts("");
  12.    printf("> ");
  13.    scanf("%1024[^\n]", str);
  14.    printf("%s\n", str);
  15. }

fseek lleva el puntero al final del archivo stdin, pero como es un stream lo que ocurre es que se descarta todo su contenido y queda preparado para nuevas entradas. El ejemplo anterior funciona para gcc y su contrapartida MinGW64 de Windows. Desconozco si otros compiladores aceptan esta instrucción.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
¿Comparar dos cadenas de caracteres en php?
PHP
Netstat89 5 10,833 Último mensaje 1 Octubre 2012, 21:21 pm
por Shell Root
Error al comparar cadenas
Programación C/C++
amchacon 1 2,306 Último mensaje 26 Enero 2013, 15:28 pm
por amchacon
[C] Comparar 2 cadenas sin usar <string.h> « 1 2 »
Programación C/C++
Ataulfo7 16 10,454 Último mensaje 9 Abril 2015, 19:22 pm
por Miseryk
comparar cadenas
Programación C/C++
judithmateos 4 2,304 Último mensaje 31 Agosto 2017, 20:10 pm
por engel lex
Problema al comparar cadenas de caracteres [C]
Programación C/C++
S4ms3pi0l__ 3 2,894 Último mensaje 27 Noviembre 2017, 20:00 pm
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines