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
Pasalo todo a minúscula y usa el strcmp de toda la vida ;)
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:
#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:
#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:
#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:
#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! ..... !!!!
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)
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