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

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  funcion strcmpi()
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: funcion strcmpi()  (Leído 3,876 veces)
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
funcion strcmpi()
« 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


En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: funcion strcmpi()
« Respuesta #1 en: 31 Diciembre 2013, 09:42 am »

Pasalo todo a minúscula y usa el strcmp de toda la vida ;)


En línea

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


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: funcion strcmpi()
« Respuesta #2 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! ..... !!!!


« Última modificación: 31 Diciembre 2013, 15:26 pm por leosansan » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: funcion strcmpi()
« Respuesta #3 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
En línea

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines