Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: vangodp en 27 Abril 2014, 10:57 am



Título: ¿Es mejor tabla de caracteres que cadena literal?:O
Publicado por: vangodp en 27 Abril 2014, 10:57 am
A ver chicos :D
Necesito esclarecer una dudita.
En el libro de deitel sobre las cadenas de caracteres tal y tal dice que es mejor una tabla o arreglo de char que una cadena literal.
A ver me explico por si las moscas:
una cadena literal es esto:

char tabla[]="sopita";

y una tabla de chars es esto:

char tabla2[] = {'s','o','p','i','t','a','\0'};

Pensaba que era lo mismo  :huh:  :o

Dice que si hago como cadena literal puede que el sistema la almecene en un lugar de la memoria que no me deje cambiar y que de la otra forma garantizo la posibilidad de cambio en un futuro.
Gracias de antemano  ;-)

c tiene mas gato encerrado que el copón XDD hay que estar atento a muchas cosas.


Título: Re: ¿Es mejor tabla de caracteres que cadena litera?:O
Publicado por: amchacon en 27 Abril 2014, 11:20 am
Para nada, ambas sintaxis son correctas.

Creo que confundes con:

char* tabla = "sopita";

Esa si que no la puedes cambiar.


Título: Re: ¿Es mejor tabla de caracteres que cadena litera?:O
Publicado por: vangodp en 27 Abril 2014, 11:42 am
cadena literal:
char color [ ] = " azul " ;
const char *ptrColor = "azul" ;

en el libro pone que estos casos de arriba no son el mismo que este:

tabla de chars:
char color [ ] = { 'a','z','u', 'l', '\0' } ;

puedo equivocarme pero si dudas haré una captura XDDD

sus palabras exactas son:

"Cuando se inicializa una variable de tipo char* con una literal de cadena, es posible que algunos compiladores
coloquen la cadena en un lugar de la memoria, en donde ésta no se pueda modificar: Si necesitara modificar una literal de cadena, podría almacenarla en un arreglo de caracteres para garantizar que pueda modificarla en cualquier
sistema."


ademas es un tip de portabilidad del libro


Título: Re: ¿Es mejor tabla de caracteres que cadena litera?:O
Publicado por: amchacon en 27 Abril 2014, 12:50 pm
Tú mismo lo has dicho, un tipo char*

Pero en los ejemplos que pones en el primer post son del tipo char[]


Título: Re: ¿Es mejor tabla de caracteres que cadena literal?:O
Publicado por: vangodp en 27 Abril 2014, 12:51 pm
pero a ver un char[] no es lo mismo que un char* :S

digo por que algo se me escapa.

Si declaro:

char letra[] = "una cadena";

char *letra = "una cadena";

no son ambos punteros a la posición 0 de la cadena.   :huh:

que relacion tienenlas 3 formas.
char color [ ] = " azul ";                     //declaro una tabla y guardo "azul"
const char *ptrColor = "azul" ;           //declado un puntero a "azul" ¿creo que apunta a la posicion 0?
char color [ ] = { 'a','z','u', 'l', '\0' } ;  // y esto queo que es lo mismo que char color [ ] = " azul ";, o me equivoco... vaya lio XDD



Título: Re: ¿Es mejor tabla de caracteres que cadena literal?:O
Publicado por: amchacon en 27 Abril 2014, 12:59 pm
A la hora de declararlo, no.

Te lo explico brevemente. Cuando tu pones:
Código
  1. char texto[5] = "Hola";

Eso es la declaración de un array. Para facilitar la sintaxis el compilador te permite escribir eso, internamente lo traduce como:
Código
  1. char texto[5] = {'H','o','l','a','\0'};

En cuanto al char*, cuando tu pones:
Código
  1. char* texto = "Hola";

Estas declarando un puntero (que no un array) que apunta a la cadena "Hola". Esa cadena suele ser un array constante que el compilador crea sobre la marcha.

Si intentas modificar el contenido de un array constante, el resultado es indefinido. Lo que si puedes hacer esque el puntero apunte a otra cadena:
Código
  1. char* texto = "Hola";
  2.  
  3. /...
  4.  
  5. texto = "Nuevo texto";


Título: Re: ¿Es mejor tabla de caracteres que cadena literal?:O
Publicado por: vangodp en 27 Abril 2014, 13:11 pm
Eso es una explicación de 1º  ;-)
Ahora si lo he pillao -_-'
Muchísimas gracias  ;D
no estaba enterandome de lo de char*ptr = "hola";
O sea que es constante y por eso no se puede cambiar hmmmm
¡Eres un artista!