Código del Día: Ejercicios con Punteros

Leonardo Herrera
Creado: 10/8/2002
Última Actualización: 21/9/2004

Hoy tengo para analizar un pequeño trozo de código. Me gustan los ejercicios con punteros, pues son sencillos y elegantes.

#include <stdio.h> 

int main( int argc, char **argv )
{
    char *p, *q;
    if ( argc != 2 || !*argv[1] )
        exit(1);

    p = q = argv[1];

    while (*q)
        q++;

    for ( q-- ; *p == *q && p < q; p++, q-- )
        ;

    printf( "%s : %s\n", argv[1], (p >= q) ? "verdadero" : "falso" );
}

Si analizamos el código, descubrimos que las primeras instrucciones validan que haya sido dado un argumento. Luego, igualan los dos punteros al argumento dado. Hasta ahí, ninguna dificultad. Luego, la línea

    while (*q) 
        q++;

Hace algo sencillo: mientras la posición de memoria a la que apunta "q" contenga un valor distinto de cero, incremente. Al final del ciclo, el puntero queda en la posición final del string entregado como argumento (cabe recordar que un "string" en C no es más que una secuencia de bytes, y el caracter nulo (cero) es el terminador).

Luego, el corazón de este ejercicio es el ciclo for que viene a continuación:

    for ( q-- ; *p == *q && p < q; p++, q-- ) 
        ;

Este ciclo hace varias cosas. "q--" hace que el puntero "q", que estaba al final del string, se devuelva una posición. Luego, se efectúa un ciclo interesantísimo: por cada iteración, el puntero "p" (que apunta al inicio) y el puntero "q" (que apunta al final) se acercan. La condición de quiebre es que donde apunta "p" y donde apunta "q" sean distintos, o que p sea igual o mayor que q.

Por último, se imprime "verdadero" si el puntero "p" es mayor o igual a "q", y "falso" si no. ¿qué significa esto? La respuesta es sencilla. Simplemente, evalúa si una palabra es palíndrome o no.

 

 

Este sitio es mantenido con ePublish