...................................................
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;
}
¡¡¡¡ Saluditos! ..... !!!!