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

zelion Zelion_cracking en yahoo.es
Mie Ene 3 21:36:38 CET 2007


 

 

  _____  

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:.

 

 

 

 

 

 

 

 

 

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


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