Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: palacio29 en 27 Agosto 2016, 19:20 pm



Título: (Consulta) Duda sobre funcionamiento de la Funcion strcmp
Publicado por: palacio29 en 27 Agosto 2016, 19:20 pm
Hola


Esta funcion devuelve 0 si las cadenas de texto son iguales (incluyendo mayúsculas y minúsculas); si la primera cadena es mayor que la segunda, devuelve un número positivo; si es mayor la segunda, devuelve un valor negativo..

Supongamos que tengo los siguientes arreglos:

 char s1[5] = "Abeja";
 char s2[5] = "Azul";

Mi duda es como se analiza cual es mayor o menor.
No entiendo como la funcion va recorriendo cada uno de los arreglos y decidir cual es mayor o menor.
La primera letra de ambos arreglos es la "A", luego ahi cambian de letra.
Como puedo pensar logicamente a esta funcion?....Va recorriendo letra x letra o que?...Y cuando dice mayor o menor se refiere al numero ascii de cada letra?


Título: Re: (Consulta) Duda sobre funcionamiento de la Funcion strcmp
Publicado por: AlbertoBSD en 27 Agosto 2016, 19:39 pm
Asi es el ASCII de cada letra compara posicion por posicion mientras sean iguales y con la primera diferencia devuelve -1 o +1 dependiendo si es menor o mayor el simbolo en cuestion.

Saludos


Título: Re: (Consulta) Duda sobre funcionamiento de la Funcion strcmp
Publicado por: palacio29 en 27 Agosto 2016, 19:40 pm
Asi es el ASCII de cada letra compara posicion por posicion mientras sean iguales y con la primera diferencia devuelve -1 o +1 dependiendo si es menor o mayor el simbolo en cuestion.

Saludos

Osea que si encuentra la primera diferencia ya termina el funciomamiento de la funcion?


Título: Re: (Consulta) Duda sobre funcionamiento de la Funcion strcmp
Publicado por: AlbertoBSD en 27 Agosto 2016, 21:51 pm
Asi es.

Suponiendo que tenemos:

Código
  1. char *A = "ABC";
  2. char *B = "BBC";
  3. char *C = "CBC";
  4. printf("La funcion devolvio %i\n",strcmp(A,B));
  5. printf("La funcion devolvio %i\n",strcmp(C,B));
  6.  

devulve:

Código:
La funcion devolvio -1
La funcion devolvio 1

Y en ambos casos solo comparara la primera letra y se detiene ahi por que son diferentes.
como A< B devuelve -1 y como C> B devuelve 1



Título: Re: (Consulta) Duda sobre funcionamiento de la Funcion strcmp
Publicado por: do-while en 28 Agosto 2016, 09:14 am
¡Buenas!

Solo voy a añadir algún dato a lo ya dicho. Los caracteres, como valores representados en un ordenador, no dejan de ser números enteros, y como números tienen su orden. Puedes verlos con el siguiente código:
Código
  1. int i;
  2.  
  3. for(i = 0 ; i < 256 ; i++)
  4.    printf("%d = %c\t", i,i);
  5.  

Ahora que sabes el orden de cada caracter (si has ejecutado el bucle anterior en un programa, claro) sabrás cual es el orden alfabético de cada caracter de la tabla ASCII, y lo que hace strcmp es decirte cual es el orden alfabético de una cadena con respecto a otra utilizando estos valores.

Siempre puedes hacerte una función propia para ver cómo funciona strcmp. Aquí te dejo un ejemplo:
Código
  1. int mistrcmp(const char* s1, const char *s2)
  2. {
  3. int diferencia, i = 0;
  4.  
  5. //mientras no hayamos llegado al final de alguna de las cadenas
  6. //y los caracteres en la posicion i sean iguales
  7. while(s1[i] != '\0' && s2[i] != '\0' && (diferencia = s1[i] - s2[i]) == 0)
  8. i++; //pasamos al siguiente caracter
  9.  
  10. /* si diferencia = s1[i] - s2[i] no es cero es que hemos encontrado
  11. * caracteres diferentes en la posicion i
  12. * asi, segun la posicion que tengan s1[i] y s2[i] en la tabla ASCII se tendra:
  13. * diferencia < 0 si s1[i] < s2[i]
  14. * diferencia > 0 si s1[i] > s2[i] */
  15. if(diferencia != 0)
  16. return diferencia;
  17.  
  18. if(s1[i] == '\0') //si hemos llegado al final de la primera cadena
  19. {
  20. if(s2[i] == '\0') //y la segunda cadena tambien ha llegado al final
  21. {
  22. //es que tienen la misma longitud y que todos los caracteres son iguales
  23. return 0; //las cadenas son iguales
  24. }
  25.  
  26. //sino todos los caracteres son iguales pero la primera cadena es mas corta
  27. return -1; //asi que es alfabeticamente menor
  28. }
  29.  
  30. //sino s2[i] == '\0' y s1[i] != '\0', ya que todos los demas casos estan incluidos
  31. //en las condiciones anteriores
  32. return 1;
  33. }
  34.