[C con Clase] [Bulk] Pregunta sobre Cadena de caracteres (Arrays)

David Reza l.fix3r.l en gmail.com
Mie Ene 3 22:10:06 CET 2007


Entonces los array casi no se usan para almacenar datos de entrada de tipo
string?
Cómo haría lo de la memoria dinámica? Con punteros?
Gracias por la ayuda.

El día 3/01/07, zelion <Zelion_cracking en yahoo.es> escribió:
>
>
>
>
>  ------------------------------
>
> *De:* cconclase-bounces en listas.conclase.net [mailto:
> cconclase-bounces en listas.conclase.net] *En nombre de *David Reza
> *Enviado el:* miércoles, 03 de enero de 2007 2:21
> *Para:* Lista de correo sobre C y C++
> *Asunto:* [Bulk] [C con Clase] Pregunta sobre Cadena de caracteres
> (Arrays)
>
>
>
> Hola, me gustaría saber como puedo hacer para que pueda hacer un programa
> que lea una cadena de caracteres y lo guarde en un array de tipo char.
>
> Esque leí que la asignación directa solo está permitida cuando se hace la
> declaración. Entonces no se puede hacer algo como:
>
> char cadena[];
> cin >> cadena;
>
>
> y esperar que todo lo que reciba cadena se guarde en el array?
> Tal vez puede que si, y sólo se guarde la primera palabra ya que un
> espacio es un carácter nulo y eso le daría a entender al compilador que
> hasta ahí termina la cadena, pero entonces sí se puede?
>
> También sé que se puede hacer con un púntero, creo que de la siguiente
> forma:
>
> char *pCadena;
> cin >> pCadena;
>
>
> o algo así.
>
> Ojalá puedan orientarme. Saludos
>
> -------------------------
> | = David Reza = |
>
>
>
>
>
> Hola David.
>
> Bueno, creo que no tienes muy claro los punteros en C/C++, haber si puedo
> orientarte un poco, ya que es donde reside la potencia de c/c++
>
>
>
> Lo primero que tienes que saber, es que todos los punteros son variables
> del tamaño de un entero "int", que guarda una direccion de memoria. Es del
> tamaño de un entero porque las direcciones de memoria son de 32 bits. (Bueno
> esto depende de la plataforma para la que desarrolles la aplicación).
>
> ¿Pero cuanta memoria maneja el puntero? Pues aquí es donde entra el tipo
> del puntero, el tipo del puntero indica como va a ser de grande los datos
> del puntero.
>
> Un ejemplo:
>
>
>
> char A = "a";     // Variable de el tamaño de un carácter "1 byte" con el
> valor "a".
>
> char *B = &A;   // "B" es un puntero "int", del tamaño de memoria de un
> carácter "char", que apunta a la direccion de "A". Esto significa que "B" =
> direccion de memoria de "A". Esto es: "B" es "int" y "*B" es "char"
>
>
>
> (Segun la propiedad asociativa, si "B" apunta a "&A" y "*B" es del tamaño
> de un carácter significa que " *B = a" )
>
>
>
> Hasta aquí supongo que todo claro.
>
>
>
> Bien veamos como manejar los tamaños de punteros con tu ejemplo.
>
>
>
> Una cosa a saber es que un array "[]", tan solo es un puntero constante
> que apunta a una direccion de memoria que se reserva al inicio de la
> aplicaion, y es asi como lo tienes que ver. Esto significa que se asigna
> espacio de memoria para el array al iniciar la aplicación, asi pues se
> necesita indicarle cuanto tamaño de memoria asignar al array. Por eso el
> array se tiene que inicializar. Y se puede inicializar de 2 maneras:
>
>
>
> char A [3];        // "A" es un puntero constante "int" de el tamaño de
> memoria de un carácter "char", que apunta a una direccion de memoria
> reservada durante el inicio de la aplicación ( en este caso el tamaño de
> memoria reservada es de 3 del tipo del puntero "3 caracteres = 3 bytes" ),
> como es un puntero constante no puedes hacer que "A" apunte a otra direccion
> de memoria, ya que el puntero es constante, y solo puede apuntar a la
> direccion de memoria asignada al inicio de la aplicación.
>
>
>
> char A []="pepito";         // "A" es igual que en el caso anterior, pero
> esta vez el tamaño de memoria reservada al inicio de la aplicación es de 6
> del tipo del puntero.
>
> "pepito = 6 caracteres = 6 bytes" reservados.
>
>
>
> En ambos casos as inicializado el array, esto significa que se ha
> reservado memoria para ellos.
>
>
>
> Asi pues no puedes hacer:
>
>
>
> char A[];           // Array sin inicializar
>
> A = "pepito";      // asignación de una cadena a una direccion de memoria
> que no existe ya que no se ha inicializado.
>
>
>
> En tu caso:
>
>
>
> char cadena[];  // Array sin inicializar
> cin >> cadena; // asignación de una cadena a una direccion de memoria que
> no existe ya que no se ha inicializado.
>
>
>
> Debes de inicializar el array con un tamaño para que se reserve la
> memoria.
>
>
>
> char cadena[50];           // Ahora cadena es un puntero constante a un
> espacio de memoria de 50 del tamaño del puntero "50 char". Esto significa
> que puedes asignar cadenas de hasta 50 caracteres, no mas, ya que solo hay
> memoria para 50. del 0 al 49.
>
>
>
> Tu otro ejemplo:
>
>
>
> char *pCadena;           // "pCadena" es un puntero "int", donde el bloque
> al que apunta es del tamaño de un carácter "char"
>
> cin >> pCadena;          //"pCadena" es una puntero, esto significa que es
> un "int" donde se almacena una direccion de memoria, a un puntero solo se le
> pueden asignar direcciones de memoria, o lo que es lo mismo, punteros. Ya
> que los punteros almacenan direcciones de memoria.
>
>
>
>
>
> Bien con todo esto, veras que tienes que saber de antemano el tamaño del
> array de memoria que quieres crear, asi que se puede desperdiciar bastante
> memoria a la larga ya que lo ideal seria que si un nombre tiene 6 caracteres
> se guardara en un espacio de memoria reservado de 6 caracteres y no en uno
> de 50.
>
>
>
> Para esto ultimo hay que usar memoria dinamica.
>
>
>
> Bueno espero no haberte liado mucho
>
>
>
> .:ZeLion:.
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
> _______________________________________________
> Cconclase mailing list
> Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
>
>
>


-- 
| = David Reza = |
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20070103/505d4adb/attachment.html>


Más información sobre la lista de distribución Cconclase