(Consulta) Duda sobre funcionamiento de la Funcion strcmp

Iniciado por palacio29, 27 Agosto 2016, 19:20 PM

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

palacio29

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?

AlbertoBSD

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
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

palacio29

Cita de: 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

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

AlbertoBSD

Asi es.

Suponiendo que tenemos:

char *A = "ABC";
char *B = "BBC";
char *C = "CBC";
printf("La funcion devolvio %i\n",strcmp(A,B));
printf("La funcion devolvio %i\n",strcmp(C,B));


devulve:

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

Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

do-while

¡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:

int i;

for(i = 0 ; i < 256 ; i++)
    printf("%d = %c\t", i,i);


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:

int mistrcmp(const char* s1, const char *s2)
{
int diferencia, i = 0;

//mientras no hayamos llegado al final de alguna de las cadenas
//y los caracteres en la posicion i sean iguales
while(s1[i] != '\0' && s2[i] != '\0' && (diferencia = s1[i] - s2[i]) == 0)
i++; //pasamos al siguiente caracter

/* si diferencia = s1[i] - s2[i] no es cero es que hemos encontrado
* caracteres diferentes en la posicion i
* asi, segun la posicion que tengan s1[i] y s2[i] en la tabla ASCII se tendra:
* diferencia < 0 si s1[i] < s2[i]
* diferencia > 0 si s1[i] > s2[i] */
if(diferencia != 0)
return diferencia;

if(s1[i] == '\0') //si hemos llegado al final de la primera cadena
{
if(s2[i] == '\0') //y la segunda cadena tambien ha llegado al final
{
//es que tienen la misma longitud y que todos los caracteres son iguales
return 0; //las cadenas son iguales
}

//sino todos los caracteres son iguales pero la primera cadena es mas corta
return -1; //asi que es alfabeticamente menor
}

//sino s2[i] == '\0' y s1[i] != '\0', ya que todos los demas casos estan incluidos
//en las condiciones anteriores
return 1;
}
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!