Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: m@o_614 en 31 Diciembre 2013, 05:05 am



Título: funcion strcmpi()
Publicado por: m@o_614 en 31 Diciembre 2013, 05:05 am
Saludos

tengo una duda con respecto a si la funcion strcmpi esta recomendada usarla o no. tengo entendido que a diferencia de strcmp, esta no es estandar, y si tengo que comparar dos cadenas pero sin diferenciar mayusculas de minusculas no se si hacerlo con esta funcion o hacerlo yo todo el procedimiento

de antemano gracias, y felices fiestas


Título: Re: funcion strcmpi()
Publicado por: amchacon en 31 Diciembre 2013, 09:42 am
Pasalo todo a minúscula y usa el strcmp de toda la vida ;)


Título: Re: funcion strcmpi()
Publicado por: leosansan en 31 Diciembre 2013, 10:59 am
...................................................
tengo que comparar dos cadenas pero sin diferenciar mayúsculas de minúsculas no se si hacerlo con esta función o hacerlo yo todo el procedimiento

de antemano gracias, y felices fiestas

Yo soy más partidario de hacerlo "a pelo", sin usar las librerías string y ctype:

Código
  1. #include <stdio.h>
  2.  
  3. int longitud_cadena(char *cadena);/*calcula lo que indica el nombre*/
  4.  
  5. int main () {
  6.    char a[]="aSdfgh",b[]="AsdfGh";
  7.    int i=0,la=0,lb=0;
  8.    la=longitud_cadena(a);
  9.    lb=longitud_cadena(b);
  10.    if (la!=lb) /*si no tienen la misma longitud no son iguales*/
  11.        printf ("NO son iguales\n");
  12.    else { /*si  tienen la misma longitud comparo los caracteres*/
  13.        for (;a[i] && (a[i]==b[i] || a[i]==b[i]-32 ||a[i]==b[i]+32 );i++);
  14.    if (i!=la) /*si no coinciden TODOS los caracteres*/
  15.        printf ("NO son equivalentes\n");
  16.    else   /* si coinciden TODOS*/
  17.        printf ("SI son equivalentes\n");
  18.    }
  19.    return  0;
  20. }
  21. int longitud_cadena(char *cadena){
  22.    int i=0;
  23.    for (;cadena[i];i++);
  24.    return i;
  25. }
  26.  

Claro que podemos prescindir de la función "longitud_cadena" usando sizeof:

Código
  1. #include <stdio.h>
  2.  
  3. int main () {
  4.    char a[]="aSdfgh",b[]="AsdfGp";
  5.    int i=0,na=0,nb=0;
  6.    na=sizeof(a)/sizeof(a[0])-1;
  7.    nb=sizeof(b)/sizeof(b[0])-1;
  8.    if (na!=nb) //si no tienen la misma longitud no son iguales
  9.        printf ("NO son iguales\n");
  10.    else { //si  tienen la misma longitud comparo los caracteres
  11.        for (;a[i] && (a[i]==b[i] || a[i]==b[i]-32 ||a[i]==b[i]+32 );i++);
  12.    if (i!=na)
  13.        printf ("NO son equivalentes\n");
  14.    else
  15.        printf ("SI son equivalentes\n");
  16.    }
  17.    return  0;
  18. }
  19.  


O bien podemos hacer la transformación en minúsculas, como sugirió amchacon, con la consiguiente penalización de tener que usar dos librerías más, string para strlen y ctype para tolower, y aún así conviene el uso de la función "convierto_minusculas" para no repetir código:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>
  4.  
  5. void convierto_minusculas (char *cadena);
  6.  
  7. int main () {
  8.    char a[]="aSdfgh",b[]="AsdfGh";
  9.    int i=0,na=0,nb=0;
  10.    na=strlen(a);
  11.    nb=strlen(b);
  12.    if (na!=nb) //si no tienen la misma longitud no son iguales
  13.        printf ("NO son iguales\n");
  14.    else { //si  tienen la misma longitud comparo los caracteres
  15.        convierto_minusculas (a);
  16.        convierto_minusculas (b);
  17.        if (strcmp(a,b)!=0 )
  18.            printf ("NO son equivalentes\n");
  19.        else
  20.            printf ("SI son equivalentes\n");
  21.    }
  22.    return  0;
  23. }
  24.  
  25. void convierto_minusculas (char *cadena){
  26.    int i=0;
  27.    for (i=0;cadena[i];i++)
  28.        cadena[i]=tolower (cadena[i]);
  29. }
  30.  

Claro que otra opción es pasar de strcmp y comparar directamente en un bucle los caracteres de las cadenas:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>
  4.  
  5. int main () {
  6.    char a[]="aSdfgh",b[]="AsdfGH";
  7.    int i=0,na=0,nb=0;
  8.    na=strlen(a);
  9.    nb=strlen(b);
  10.    if (na!=nb) //si no tienen la misma longitud no son iguales
  11.        printf ("NO son iguales\n");
  12.    else { //si  tienen la misma longitud comparo los caracteres
  13.        for (;a[i] && (tolower (a[i])==tolower (b[i])) ;i++);
  14.    if (i!=na)
  15.        printf ("NO son equivalentes\n");
  16.    else
  17.        printf ("SI son equivalentes\n");
  18.    }
  19.    return  0;
  20. }
  21.  

;-)  ;-) Felices Navidades y Próspero Año Nuevo.  ;-)  ;-)


¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: funcion strcmpi()
Publicado por: rir3760 en 31 Diciembre 2013, 16:22 pm
tengo una duda con respecto a si la funcion strcmpi esta recomendada usarla o no. tengo entendido que a diferencia de strcmp, esta no es estandar, y si tengo que comparar dos cadenas pero sin diferenciar mayusculas de minusculas no se si hacerlo con esta funcion o hacerlo yo todo el procedimiento
Si en tu programa debes realizar esa operación bien utilizas la función provista por tu compilador o desarrollas una propia, cada opción con sus ventajas: con la primera no reinventas la rueda y con la segunda mantienes el programa portable (apegado al estándar).

Cual elegir depende de los requisitos del programa (si se trata de un trabajo de clase).

Un saludo