elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Problema con C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con C  (Leído 1,907 veces)
MrDev

Desconectado Desconectado

Mensajes: 31


Ver Perfil
Problema con C
« en: 17 Marzo 2016, 10:31 am »

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.


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int longitud(char * cadena);
  5. char * invertirCadena(char * c1);
  6.  
  7. int main(int argc, const char * argv[]) {
  8.    // insert code here...
  9.  
  10.    char cadena[5] = "Pepe";
  11.    int tamañoCadena=longitud(cadena);
  12.  
  13.    printf("El tamaño de la cadena es %d \n",tamañoCadena);
  14.    char *salida=invertirCadena(cadena);
  15.    printf("La cadena introducida es %s \n",salida);
  16.  
  17.    return 0;
  18. }
  19.  
  20. int longitud(char * s1){
  21.    int i=0;
  22.    while(s1[i]!='\0'){
  23.        i++;
  24.    }
  25.    return i;
  26. }
  27.  
  28. char * invertirCadena(char * c1){
  29.    int i = 0;
  30.    int j=longitud(c1)+1;
  31.    char salida[j];
  32.  
  33.    while(j!=0){
  34.        salida[i]=c1[j];
  35.        ++i;
  36.        j--;
  37.    }
  38.  
  39.    return salida;
  40. }


En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: Problema con C
« Respuesta #1 en: 17 Marzo 2016, 15:36 pm »

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
  1. char cadena[] = "Esto es una cadena";

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

Por último, intercambia los valores:
Código
  1. 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:
Código:
'E' 's' 't' 'o' '_' 'e' 's' '_' 'u' 'n' 'a' '_' 'c' 'a' 'd' 'e' 'n' 'a' '\0'

Entonces, lo que hacemos es:
Código:
                                 *   *
'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:
Código:
                                 *   *
'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:
Código:
                             *           *
'E' 's' 't' 'o' '_' 'e' 's' '_' 'n' 'u' 'a' '_' 'c' 'a' 'd' 'e' 'n' 'a' '\0'
Intercambiamos los valores señalados por los asteriscos:
Código:
                             *           *
'E' 's' 't' 'o' '_' 'e' 's' 'a' 'n' 'u' '_' '_' 'c' 'a' 'd' 'e' 'n' 'a' '\0'

Seguimos decrementando 'i':
Código:
                         *                   *
'E' 's' 't' 'o' '_' 'e' 's' 'a' 'n' 'u' '_' '_' 'c' 'a' 'd' 'e' 'n' 'a' '\0'
Intercambiamos...
Código:
                         *                   *
'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)
Código:
*                                                                   *
'E' 'n' 'e' 'd' 'a' 'c' '_' 'a' 'n' 'u' '_' 's' 'e' '_' 'o' 't' 's' 'a' '\0'
Y como siempre, intercambiamos:
Código:
*                                                                   *
'a' 'n' 'e' 'd' 'a' 'c' '_' 'a' 'n' 'u' '_' 's' 'e' '_' 'o' 't' 's' 'E' '\0'

Al final, obtenemos la cadena "anedac  anuse otsE"


« Última modificación: 17 Marzo 2016, 15:40 pm por class_OpenGL » En línea

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

Desconectado Desconectado

Mensajes: 31


Ver Perfil
Re: Problema con C
« Respuesta #2 en: 17 Marzo 2016, 20:14 pm »

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!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema BlueZScanner y problema de conexión
Hacking Mobile
Kasswed 3 6,239 Último mensaje 6 Mayo 2006, 22:04 pm
por Gospel
[Duda y problema] Tengo un problema « 1 2 »
Windows
Killer2812 16 13,747 Último mensaje 26 Marzo 2015, 06:21 am
por scott_
problema de c++
Programación C/C++
gatocaro 1 4,359 Último mensaje 29 Septiembre 2021, 22:04 pm
por Eternal Idol
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines