funcion strcmpi()

Iniciado por m@o_614, 31 Diciembre 2013, 05:05 AM

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

m@o_614

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

amchacon

Pasalo todo a minúscula y usa el strcmp de toda la vida ;)
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

leosansan

#2
Cita de: m@o_614 en 31 Diciembre 2013, 05:05 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 (cpp) [Seleccionar]

#include <stdio.h>

int longitud_cadena(char *cadena);/*calcula lo que indica el nombre*/

int main () {
   char a[]="aSdfgh",b[]="AsdfGh";
   int i=0,la=0,lb=0;
   la=longitud_cadena(a);
   lb=longitud_cadena(b);
   if (la!=lb) /*si no tienen la misma longitud no son iguales*/
       printf ("NO son iguales\n");
   else { /*si  tienen la misma longitud comparo los caracteres*/
       for (;a[i] && (a[i]==b[i] || a[i]==b[i]-32 ||a[i]==b[i]+32 );i++);
   if (i!=la) /*si no coinciden TODOS los caracteres*/
       printf ("NO son equivalentes\n");
   else   /* si coinciden TODOS*/
       printf ("SI son equivalentes\n");
   }
   return  0;
}
int longitud_cadena(char *cadena){
   int i=0;
   for (;cadena[i];i++);
   return i;
}


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

Código (cpp) [Seleccionar]

#include <stdio.h>

int main () {
    char a[]="aSdfgh",b[]="AsdfGp";
    int i=0,na=0,nb=0;
    na=sizeof(a)/sizeof(a[0])-1;
    nb=sizeof(b)/sizeof(b[0])-1;
    if (na!=nb) //si no tienen la misma longitud no son iguales
        printf ("NO son iguales\n");
    else { //si  tienen la misma longitud comparo los caracteres
        for (;a[i] && (a[i]==b[i] || a[i]==b[i]-32 ||a[i]==b[i]+32 );i++);
    if (i!=na)
        printf ("NO son equivalentes\n");
    else
        printf ("SI son equivalentes\n");
    }
    return  0;
}


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 (cpp) [Seleccionar]

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

void convierto_minusculas (char *cadena);

int main () {
   char a[]="aSdfgh",b[]="AsdfGh";
   int i=0,na=0,nb=0;
   na=strlen(a);
   nb=strlen(b);
   if (na!=nb) //si no tienen la misma longitud no son iguales
       printf ("NO son iguales\n");
   else { //si  tienen la misma longitud comparo los caracteres
       convierto_minusculas (a);
       convierto_minusculas (b);
       if (strcmp(a,b)!=0 )
           printf ("NO son equivalentes\n");
       else
           printf ("SI son equivalentes\n");
   }
   return  0;
}

void convierto_minusculas (char *cadena){
   int i=0;
   for (i=0;cadena[i];i++)
       cadena[i]=tolower (cadena[i]);
}


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

Código (cpp) [Seleccionar]

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

int main () {
   char a[]="aSdfgh",b[]="AsdfGH";
   int i=0,na=0,nb=0;
   na=strlen(a);
   nb=strlen(b);
   if (na!=nb) //si no tienen la misma longitud no son iguales
       printf ("NO son iguales\n");
   else { //si  tienen la misma longitud comparo los caracteres
       for (;a[i] && (tolower (a[i])==tolower (b[i])) ;i++);
   if (i!=na)
       printf ("NO son equivalentes\n");
   else
       printf ("SI son equivalentes\n");
   }
   return  0;
}


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

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



rir3760

Cita de: m@o_614 en 31 Diciembre 2013, 05:05 AMtengo 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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language