Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Volver a la posicion inicial de un puntero

Estas en el tema de Volver a la posicion inicial de un puntero en el foro de C/C++ en Foros del Web. ¡Hola a todos!, me gustaría comentarles una duda que tengo y es la siguiente: Yo tengo una función encargada de Leer una cadena (un puntero ...
  #1 (permalink)  
Antiguo 20/05/2013, 14:54
Avatar de Doommarine_Maxi  
Fecha de Ingreso: febrero-2011
Mensajes: 54
Antigüedad: 13 años, 9 meses
Puntos: 8
Volver a la posicion inicial de un puntero

¡Hola a todos!, me gustaría comentarles una duda que tengo y es la siguiente:

Yo tengo una función encargada de Leer una cadena (un puntero tipo char) y para leerlo lo que hago es pasar un puntero tipo char como parametro y copiar lo de la cadena de la clase al puntero del parametro. En fin la función es la siguiente.

Código C++:
Ver original
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <ctype.h>
  4. #include <string.h>
  5.  
  6. using namespace std;
  7.  
  8. class Cadena
  9. {
  10.     public:
  11.         Cadena();
  12.         Cadena(const char*);
  13.         Cadena(int);
  14.         Cadena(const Cadena &);
  15.         ~Cadena();
  16.         void Asignar(const char*);
  17.         void Leer(char*);
  18.     private:
  19.         char *cad;
  20.  
  21. };
  22.  
  23. Cadena::Cadena()
  24. {
  25.     cad = NULL;
  26. }
  27. Cadena::Cadena(int x)
  28. {
  29.     cad = new char[x + 1];
  30. }
  31. Cadena::Cadena(const char* temp)
  32. {
  33.     cad = new char[strlen(temp)+1];
  34.     strcpy(cad, temp);
  35. }
  36. Cadena::Cadena(const Cadena &temp)
  37. {
  38.     cad = new char[strlen(temp.cad)+1];
  39.     strcpy(cad, temp.cad);
  40. }
  41. Cadena::~Cadena()
  42. {
  43.     delete[] cad;
  44. }
  45.  
  46. void Cadena::Asignar(const char* temp)
  47. {
  48.     delete[] cad;
  49.     cad = new char[strlen(temp)+1];
  50.     strcpy(cad, temp);
  51. }
  52. void Cadena::Leer(char* c)
  53. {
  54.     int x=0;
  55.     while (*cad)
  56.     {
  57.         *c = *cad;
  58.         cad++;
  59.         x++;
  60.         c++;
  61.     }
  62.     cad -= x;
  63.     c -= x;
  64. }
  65.  
  66. int main()
  67. {
  68.     Cadena Txt1("Estoy esperando el Doom 4 desde 2008");
  69.     char ty[256];
  70.    
  71.     Txt1.Leer(ty);
  72.     cout << ty << endl;
  73.     return 0;
  74. }

Lo interesante en esta función es la parte de void Cadena::Leer(char* c).

Como verán, lo que yo trato de hacer es enviar un array de caracteres de 255 lugares disponibles como parametro de la función leer. El puntero del parametro como es por valor iguala su valor a la dirección de memoria inicial del array ty (c = &ty[0]).

Eso lo tenemos claro, el problema es el siguiente, yo con el bucle while copio todos los valores de la cadena de la clase al parámetro (que como esta igualado a una referencia cambia automáticamente los valores del array). Tuve que ir aumentado la posición de memoria del puntero cada vez que fui copiando y al final tuve que restar otra vez la cantidad de veces que aumente la posición de memoria antes de terminar la función... la pregunta es: ¿Hay alguna forma en la que yo pueda volver a la dirección de memoria inicial de un puntero sin tener que llevar la cuenta de cuantas veces la aumente? es decir si puedo volver a señalar a la direccion inicial del array en ambos punteros sin tener que restarles x.

Gracias a todos por su tiempo.
  #2 (permalink)  
Antiguo 20/05/2013, 15:02
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 12 años, 4 meses
Puntos: 28
Respuesta: Volver a la posicion inicial de un puntero

Pues hay dos formas:

- Uses una variable buffer:

Código:
char* buffer = cad;
 int x=0;
    while (*buffer)
    {
        *c = *buffer;
        buffer++;
        x++;
        c++;
    }
    c -= x;
O uses los operadores []:

Código:
int x=0;
    while (cad[x])
    {
        c[x] = cad[x];
        x++;
    }

Etiquetas: memoria, punteros, resetear
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:09.