Problema con C

Iniciado por MrDev, 17 Marzo 2016, 10:31 AM

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

MrDev

Hola buenas, ya he estado por aqui preguntando algunas dudas, y mi problema ahora es con C, estamos haciendo una funcion que introduciendole una cadena, nos la devuelva invertida, mi codigo es este, y no consigo que me la imprima invertida, sino que me sale en blanco justo donde deberia salir la cadena.



#include <stdio.h>
#include <stdlib.h>

int longitud(char * cadena);
char * invertirCadena(char * c1);

int main(int argc, const char * argv[]) {
    // insert code here...
   
    char cadena[5] = "Pepe";
    int tamañoCadena=longitud(cadena);
   
    printf("El tamaño de la cadena es %d \n",tamañoCadena);
    char *salida=invertirCadena(cadena);
    printf("La cadena introducida es %s \n",salida);
   
    return 0;
}

int longitud(char * s1){
    int i=0;
    while(s1[i]!='\0'){
        i++;
    }
    return i;
}

char * invertirCadena(char * c1){
    int i = 0;
    int j=longitud(c1)+1;
    char salida[j];
   
    while(j!=0){
        salida[i]=c1[j];
        ++i;
        j--;
    }
   
    return salida;
}

class_OpenGL

#1
Primero quiero aclarar una cosa: ya hay una función para calcular la longitud de una cadena xD. Se llama strlen y puedes usarla al incluir string.h.

Segundo, recomiendo no retornar cadenas declaradas en una función (para mas detalles, pregunta). Lo que yo haría es intercambiar los valores de la cadena original para obtener el resultado final. Es decir, haría esto:

Tenemos la cadena llamada "cadena" (así de original soy) que equivale a "Esto es una cadena"
Código (cpp) [Seleccionar]
char cadena[] = "Esto es una cadena";

Lo que hay que hacer es recorrer la mitad de la cadena:
Código (cpp) [Seleccionar]
int longitud_cadena = strlen(cadena);
int i = longitud_cadena / 2 - 1;
while(i >= 0)


Por último, intercambia los valores:
Código (cpp) [Seleccionar]
intercambiar_valores(cadena[i], cadena[longitd_cadena - i]); // Esta función me la he inventado. Tendrás que diseñar tu mismo una función que intercambie valores o puedes intercambiar los valores directamente dentro del while.

____________________________

Por si no se ha entendido, esto es lo que está sucediendo:

Memoria donde se almacena la cadena:
'E' 's' 't' 'o' '_' 'e' 's' '_' 'u' 'n' 'a' '_' 'c' 'a' 'd' 'e' 'n' 'a' '\0'

Entonces, lo que hacemos es:
                                 *   *
'E' 's' 't' 'o' '_' 'e' 's' '_' 'u' 'n' 'a' '_' 'c' 'a' 'd' 'e' 'n' 'a' '\0'

Intercambiamos los valores marcados por los asteriscos. Los asteriscos marcan la posición dada por la variable 'i' y por la operación 'longtud_cadena - i', es decir, '18/2 - 1' y '18 - 18 - 18/2 - 1' respectivamente:
                                 *   *
'E' 's' 't' 'o' '_' 'e' 's' '_' 'n' 'u' 'a' '_' 'c' 'a' 'd' 'e' 'n' 'a' '\0'


En el siguiente ciclo, la variable 'i' se decrementa en 1. Entonces, ahora 'i' vale 7 y la operación 'longitud_cadena - i' vale 18 - 7:
                             *           *
'E' 's' 't' 'o' '_' 'e' 's' '_' 'n' 'u' 'a' '_' 'c' 'a' 'd' 'e' 'n' 'a' '\0'

Intercambiamos los valores señalados por los asteriscos:
                             *           *
'E' 's' 't' 'o' '_' 'e' 's' 'a' 'n' 'u' '_' '_' 'c' 'a' 'd' 'e' 'n' 'a' '\0'


Seguimos decrementando 'i':
                         *                   *
'E' 's' 't' 'o' '_' 'e' 's' 'a' 'n' 'u' '_' '_' 'c' 'a' 'd' 'e' 'n' 'a' '\0'

Intercambiamos...
                         *                   *
'E' 's' 't' 'o' '_' 'e' '_' 'a' 'n' 'u' '_' 's' 'c' 'a' 'd' 'e' 'n' 'a' '\0'


Y así hasta que i sea 0 (después el while se detendrá por la condición)
*                                                                   *
'E' 'n' 'e' 'd' 'a' 'c' '_' 'a' 'n' 'u' '_' 's' 'e' '_' 'o' 't' 's' 'a' '\0'

Y como siempre, intercambiamos:
*                                                                   *
'a' 'n' 'e' 'd' 'a' 'c' '_' 'a' 'n' 'u' '_' 's' 'e' '_' 'o' 't' 's' 'E' '\0'


Al final, obtenemos la cadena "anedac  anuse otsE"

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

MrDev

Gracias compañero por tu respuesta, lo he entendido, por cierto, no puedo usar la funcion strlen porque nos pidieron hacerlo con una funcion propia, hecha por nosotros mismos XD. Muchas gracias!