Comparar cadenas sin usar strcmp

Iniciado por Rockmore, 23 Octubre 2010, 21:13 PM

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

do-while

#10
Paso por paso.

El for no tiene cuerpo, todas las comprobaciones se hacen en la condicion de continuidad. (Date cuenta de que nada mas terminar la declaracion del for, hay un punto y coma, por lo tanto el valor se le asigna a ord al salir del for)

Cualquier cadena termina en cero, y cero en C significa falso y distinto de cero verdadero. Por lo tanto

nom1[k] && nom2[k]

significa que for se ejecutara mientras las dos cadenas tengan un caracter, o lo que es lo mismo, que el for finalizara cuando se acabe una de las dos cadenas (o las dos).

La siguiente condicion te dice que el for continuara mientras las letras de la posicion actual sean iguales.

Es decir, de todas todas se saldra del for si alguna de las cadenas ha terminado o si el caracter de la posicion i es distinto.

(cambio la i por la k para que no me salga en cursiva)

Caso1: nom1 ha terminado
   En este caso, nom1[k] == 0, por lo tanto si la segunda cadena es mas larga, 0 - letra (no simbolo, sino letra) sera menor que cero. Y si la segunda cadena tambien ha terminado, las dos seran iguales:

Hola
Holaa

o sino

Hola
Hola

(compruebalo mirando las condiciones del for con lapiz y papel)

Caso2: nom2 ha terminado
   Si se da este caso, nom1 no habra terminado (estudia sobre la evaluacion del y logico), pero nom2 si, por lo tando nom1[k]!=0 y nom2[k] == 0, suponiendo que nom1[k] es una letra del alfabeto, se tiene que nom1[k] > 0 y nom2[k] == 0. Es decir, nom1[k] - nom2[k] > 0, lo cual tiene su logica, ya que todas las letras de nom1 seran iguales a las de nom2 mientras no se termine nom2, pero nom1 sera mas larga:

Holaa
Hola
(como antes, comprueba con lapiz y papel que efectivamente es asi)

Caso3: nom1[k] != nom2[k]
   Ahora no ha terminado ni nom1, ni nom2 y se ha encontrado una letra diferente en las cadenas. Por lo tanto nom1[k] - nom2[k] sera menor o mayor que cero, segun nom1[k] sea menoro o mayor alfabeticamente que nom2[k].

(como siempre, compruebalo con lapiz y papel)

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

PiroskY

#11
Entiendo, pero la pregunta era por:

(i = 0 ; nom1[i ] && nom2[i ] && nom1[i ] == nom2[i ] ; i++)

el for va a seguir corriendo mientras nom1 en la posicion i, que?
el resto lo entiendo

Edito:
Relei tu post a ver si entendia, y creo que entendi, o sea
nom1[i ] && nom2[i ]

es equivalente a poner
nom1[i ] != 0 && nom2[i ] != 0 ?

Si es eso ya entendi todo y corto con el off :P

do-while

#12
Eso mismo es, como en C no hay booleanos, una expresion que vale cero es falso, y una que es distinta de cero sera verdadero.

Por lo tanto poner

for(i=0 ; s[i] ; i++)

es equivalente a poner

for(i=0 ; s[i] != 0 ; i++)


¡Saludos!

Una cosa mas, si en lugar de tomar como valor de la comparacion

ord = nom1[i] - nom2[i];

tomas

ord = (unsigned char)nom1[i] - (unsigned char)nom2[i];


Te olvidas de los problemas que te pueden dar los simbolos y siempre que una cadena sea mas larga que otra tendras un valor positivo o negativo segun sea la primera o la segunda mas larga.
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!