[Opinión] Interesante manera de usar char* con cout

Iniciado por Shout, 23 Julio 2013, 13:35 PM

0 Miembros y 3 Visitantes están viendo este tema.

Shout

Buenas!!

Pues justo hice una función como esta:
Código (cpp) [Seleccionar]

void something(char *text){
    cout << *text;
}

Y sólo me imprimía text[0].
Suponí que podría ir aumentando el puntero hasta llegar a \0:
Código (cpp) [Seleccionar]

void something(char *text){
    while(*text != '\0') cout << *text++;
    // nota: si ponemos *text++ en el while()
    // se salta el caracter 0
}

Efectivamente, funciona.

Pero luego pensé en otra manera (sin usar while), y me salió esto:
Código (cpp) [Seleccionar]

void something(char **text){
    cout << *text;
}
char *str = "hello world";
something(&str);


¿Cuál creéis que es la mejor opción?
La primera, sin duda, es más simple, pero usa while.
La segunda, al ser un poco más complicada, quita legibilidad, pero parece funcionar más rápido.
I'll bring you death and pestilence, I'll bring you down on my own

Oblivi0n

Usa cout como siempre.

Imaginate ver 
Código (cpp) [Seleccionar]
  while(*text != '\0') cout << *text++; 2 años despues, pensarás que que carajo estás haciendo...

amchacon

Código (cpp) [Seleccionar]
void something(char **text){
   cout << *text;
}
char *str = "hello world";
something(&str);


Esto es lo mismo que poner:

Código (cpp) [Seleccionar]
char *str = "hello world";
cout<<str;
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

Shout

Cita de: Oblivi0n en 23 Julio 2013, 13:43 PM
Usa cout como siempre.

Imaginate ver 
Código (cpp) [Seleccionar]
  while(*text != '\0') cout << *text++; 2 años despues, pensarás que que carajo estás haciendo...
Tienes razón  :laugh:
Cita de: amchacon en 23 Julio 2013, 13:44 PM
Código (cpp) [Seleccionar]
void something(char **text){
   cout << *text;
}
char *str = "hello world";
something(&str);


Esto es lo mismo que poner:

Código (cpp) [Seleccionar]
char *str = "hello world";
cout<<str;

Lo sé, lo sé.
Mi función creaba una especie de "header" con un montón de opciones, parámetros, FAQ y demás (como quien hace command -h), así que necesitaba envolver eso en una función para no tener que escribirlo cada vez.
Y en ese texto grande tenía que insertar algunas variables.
I'll bring you death and pestilence, I'll bring you down on my own

eferion

Es simple...

Código (cpp) [Seleccionar]
void something(char *text){
    cout << *text;
}


*text es de tipo char... luego cout solo te imprime un carácter.

Código (cpp) [Seleccionar]
void something(char **text){
    cout << *text;
}


*text es de tipo puntero a char... o cadena de caracteres... en este caso vuelca caracteres hasta que se encuentra con el primer nulo.

Código (cpp) [Seleccionar]
void something(char *text){
    cout << text;
}


Esta última versión es similar a la anterior sin punteros dobles... y por tanto más usable y manejable.

zonahurbana

Cita de: eferion en 23 Julio 2013, 15:10 PM
Código (cpp) [Seleccionar]
void something(char *text){
    cout << *text;
}


*text es de tipo char... luego cout solo te imprime un carácter.
Cuando se invoca la función y se le pasa como argumento el nombre de un vector de caracteres, realmente se le está pasando la dirección de memoria del primer elemento y por ello sólo muestra el primero, ¿verdad?

Cita de: eferion en 23 Julio 2013, 15:10 PM
Código (cpp) [Seleccionar]
void something(char **text){
    cout << *text;
}
Esto es un puntero a otro puntero a char.
Cuando se invoque la función y se le pase como argumento la dirección del primer elemento de un vector de caracteres, dicha dirección de memoria es almacenada en text (variable puntero a puntero). Si escribo *text es como mostrar el valor apuntado por text, que viene a ser un puntero a char. ¿Entonces no debería mostrar la dirección de memoria del vector?

Tal vez puedan explicarme un poco que no lo veo tan simple :S
Nunca dejar de aprender es importante, más allá del ritmo que se siga ...

eferion

Cita de: zonahurbana en 24 Julio 2013, 06:46 AM
Cuando se invoca la función y se le pasa como argumento el nombre de un vector de caracteres, realmente se le está pasando la dirección de memoria del primer elemento y por ello sólo muestra el primero, ¿verdad?

Si, es cierto, pero la función que recibe un vector de caracteres no se limita a imprimir ese carácter ... la función que recibe un vector de caracteres va a procesar todos los caracteres del vector hasta que encuentre un carácter nulo.

Cita de: zonahurbana en 24 Julio 2013, 06:46 AM
Esto es un puntero a otro puntero a char.
Cuando se invoque la función y se le pase como argumento la dirección del primer elemento de un vector de caracteres, dicha dirección de memoria es almacenada en text (variable puntero a puntero). Si escribo *text es como mostrar el valor apuntado por text, que viene a ser un puntero a char. ¿Entonces no debería mostrar la dirección de memoria del vector?

A ver, cout es una clase de c++. Esta clase tiene varias sobrecargas del operador de inserción ( << ), una para cada tipo de dato soportado.

Cuando a cout se le pasa mediante el operador de inserción un array de caracteres hace exactamente lo que te he comentado, imprimir todos los caracteres que encuentre hasta llegar al primer nulo.

Tu no tienes que mirar las transformaciones que hagas de un dato a la hora de llamar a cout... limítate a ver qué tipo le estás pasando a la clase.

Es decir:

Código (cpp) [Seleccionar]
void something(char *text){
    cout << &(*(&(*(&(*text)))));
    cout << text;
}


En ambos casos te va a mostrar una cadena de texto. A la función que recibe el dato únicamente sabe qué tipo le estás pasando, no entiende de las transformaciones previas que le hayas hecho.


Eternal Idol

#7
¿Y si usas cout con cadenas de la libreria standard de C++?  :silbar:
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

eferion

Te refieres a ...

Código (cpp) [Seleccionar]
void something( const std::string& text){
    cout << text;
}


Si es el caso... te va a mostrar la cadena de texto, como es de esperar.

Eternal Idol

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón