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

Cadenas en C/C++

Estas en el tema de Cadenas en C/C++ en el foro de C/C++ en Foros del Web. Buenas a todos! Les comento: Desde que he comenzado a espíar un poquito sobre C y C++ me he encontrado con el eterno problema de ...
  #1 (permalink)  
Antiguo 19/03/2012, 14:02
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 10 meses
Puntos: 35
Cadenas en C/C++

Buenas a todos! Les comento: Desde que he comenzado a espíar un poquito sobre C y C++ me he encontrado con el eterno problema de las cadenas. Yo vengo de lenguajes de alto nivel, en el cual con un simple cadena = "Hola mundo como andan?" ya basta para conformar una variable con ese valor sin tener que indicar el número de caracteres ni nada por el estilo. Yo creo que es por esto mismo mi tal complicación, no? Bueno, el tema es el siguiente: He buscado por todos lados pero no he podido encontrar un ejemplo concreto el cual me sirva a mi para entender como hacer para almacenar en una variable una cadena con X cantidad de caracteres, pues, que yo no tenga que indicar el número de caracteres de la cadena. Mejor dicho, si indicarlo, pero saberlo previamente o algún metodo de esos. He visto sobre la función malloc() pero no he podido resolver nada aún. Creo que no es muy complicado lo que pido, un ejemplo concreto sobre cómo añadir una frase con X caracteres a una variable.

Gracias!
  #2 (permalink)  
Antiguo 19/03/2012, 17:04
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 11 meses
Puntos: 94
Respuesta: Cadenas en C/C++

Hola carbon! nose si entendi muy bien lo que queres pero bueno te dejo mi respuesta... Los arreglos se pueden asignar directamente con una frase, palabra, etc de la siguiente manera:
Código C:
Ver original
  1. char arr[]="hola soy una cadena";
De esta manera le asignamos a arr la cadena sin necesidad de especificar el tamaño del arreglo.
Tambien se puede utilizar punteros, ej:
Código C:
Ver original
  1. char *p="hola soy una cadena";

Espero te sirva, saludos
  #3 (permalink)  
Antiguo 19/03/2012, 17:15
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Cadenas en C/C++

Si te decides por C++, puedes usar la clase string para almacenar cadenas de caracteres.

Referencias y ejemplos: http://www.cplusplus.com/reference/string/string/
  #4 (permalink)  
Antiguo 20/03/2012, 11:32
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 10 meses
Puntos: 35
Respuesta: Cadenas en C/C++

Cita:
Iniciado por cesar_casla Ver Mensaje
Hola carbon! nose si entendi muy bien lo que queres pero bueno te dejo mi respuesta... Los arreglos se pueden asignar directamente con una frase, palabra, etc de la siguiente manera:
Código C:
Ver original
  1. char arr[]="hola soy una cadena";
De esta manera le asignamos a arr la cadena sin necesidad de especificar el tamaño del arreglo.
Tambien se puede utilizar punteros, ej:
Código C:
Ver original
  1. char *p="hola soy una cadena";

Espero te sirva, saludos
Ah! Pense que siempre habia que indicar la cant. de caracteres Gracias!

Cita:
Iniciado por sam90 Ver Mensaje
Si te decides por C++, puedes usar la clase string para almacenar cadenas de caracteres.

Referencias y ejemplos: http://www.cplusplus.com/reference/string/string/
Gracias! Me sirve :D

  #5 (permalink)  
Antiguo 20/03/2012, 11:51
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Cadenas en C/C++

Las cadenas staticas no hace falta que indiques la cantidad de caracteres. Pero si quieres que el usuario ingrese una cadena deberres indicarla o usar malloc para reservarla.

Sino puedes usar la clase string como te indique antes.
  #6 (permalink)  
Antiguo 20/03/2012, 16:12
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 10 meses
Puntos: 35
Respuesta: Cadenas en C/C++

Cita:
Iniciado por sam90 Ver Mensaje
Las cadenas staticas no hace falta que indiques la cantidad de caracteres. Pero si quieres que el usuario ingrese una cadena deberres indicarla o usar malloc para reservarla.

Sino puedes usar la clase string como te indique antes.
Ah, y en caso de utilizar la clase strin en C++, que funcion debería utilizar?
  #7 (permalink)  
Antiguo 20/03/2012, 20:54
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Cadenas en C/C++

En la pagina que te pase estan los ejemplos:

Código C++:
Ver original
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. int main () {
  6.   int n;
  7.   string str;
  8.  
  9.   cout << "Enter first name:";
  10.   cin >> str;
  11.  
  12.   cout << "Thanks, " << str << ".\n";
  13.  
  14.   return 0;
  15. }
  #8 (permalink)  
Antiguo 21/03/2012, 15:14
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 10 meses
Puntos: 35
Respuesta: Cadenas en C/C++

Gracias! :D
  #9 (permalink)  
Antiguo 21/03/2012, 15:30
Avatar de kurekshikam  
Fecha de Ingreso: marzo-2012
Ubicación: En casa
Mensajes: 13
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Cadenas en C/C++

Cita:
Iniciado por cesar_casla Ver Mensaje
[...]
Tambien se puede utilizar punteros, ej:
Código C:
Ver original
  1. char *p="hola soy una cadena";
[...]
Perdón por interrumpir en este post para preguntar, pero acabo de leer algo que me generó dudas (acabo de empezar con c++ y su sintax no la acabo de pillar) pero tenía pensado que los punteros era como una forma abreviada de referirse a una variable (quizás estea muy equivocado y no sea así, es lo más probable), pero puedo observar que "cesar_casla" pone una cadena en un puntero, ¿como es eso posible? a donde apunta ese puntero si ni siquiera lo declaro antes.

Gracias y disculpen la irrupción en el post.
  #10 (permalink)  
Antiguo 21/03/2012, 16:05
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 11 meses
Puntos: 94
Respuesta: Cadenas en C/C++

Hola kurekshikam! no entiendo bien cuando decis "tenía pensado que los punteros era como una forma abreviada de referirse a una variable". En mi primera respuesta me olvide de aclarar que todo lo que dije era con respecto a C y no C++, ya que si no me equivoco en C++ existe el tipo de dato string
Un puntero en C es una variable q contiene una direccion de memoria. En el ejemplo que di la declaracion del puntero seria: char *p y a donde apunta seria ="hola soy una cadena"
Código C:
Ver original
  1. char *p="hola soy una cadena"; // declaro un puntero a char y le digo q apunte a la cadena

Espero haya aclarado tus dudas sino segui preguntando

Saludos
  #11 (permalink)  
Antiguo 21/03/2012, 18:17
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Cadenas en C/C++

Los punteros son una variable de 32 bits (o 64) que almacenan una direccion de memoria. En esa direccion estan los datos que nos interesa.
Cuando definimos
Char * p = "Hola mundo";

El compilador lo que hace es alamacenar "Hola mundo" en la parte statica de la memoria y declara un puntero p que tiene la direccion de memoria de esa parte statica (Al primer caracter de la cadena, osea, "H").

Ahora lo que tienes que entender que tambien se puede aplicar aritmetica de direcciones de memoria. Es por eso que si yo a p le sumo uno obtengo el siguiente caracter. Una forma abreviada de hacer eso es usar los corchetes, de la sigueinte manera:

p[1] == 'o' y p[2] == 'l'

p[1] es lo mismo que hacer *(p+1) pero creo que con esto te la estoy complicando mucho....

Ahora otra cosa para que tengas en cuenta.

Cuando declaramos un array de esta forma:
char a[10];
El compilador hace algo muy distinto a lo que hace con la variable p, aunque la variable a sigue siendo un puntero. De esta nueva forma el compilador reserva el espacio en memoria (si es dentro de una funcion en la memoria local) pero esta vez el puntero a no existe en memoria. Solo existe para el compilador. A la hora de enlazar traduce cada aparicion de a por su direccion...

No se si se alla entendido pero te muetro un ejemplo con lo que se puede hacer y que no se puede hacer con las dos declaraciones:

Código C:
Ver original
  1. char * p = "Hola mundo";
  2. char * t;
  3. char a[10];
  4.  
  5. p = "Chau mundo"; // Si se puede
  6. p = t; // si se puede
  7. a = "No se puede hacer"; // No se puede, porque no se puede cambiar el valor de a pero si los datos a donde apuntan.
  8. a[1] = 'o';a[2]='l'; // Si se puede hacer

Trate de ser lo mas entendible posible.. cualquier cosa segui preguntando...estoy seguro que estoy generando nuevas dudas porque me parece que me puse un poco tecnico... pero me parece un tema mas que importante si se quiere aprender de verdad C/C++.

Saludos
  #12 (permalink)  
Antiguo 22/03/2012, 04:19
Avatar de kurekshikam  
Fecha de Ingreso: marzo-2012
Ubicación: En casa
Mensajes: 13
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Cadenas en C/C++

Gracias a ambos... ya veo que me equivocaba con los punteros, aún me falta mucho para entender C++

Entonces así por lo breve, un puntero apunta hacia un espacio en la memoria y reserva un ese espacio en la memoria de un tamaño "x" por defecto y en ese espacio el usuario puede meter lo que quiera. Mientras que si declaro una variable el programa va a reservar el espacio "y" que yo le diga, es decir, que si le digo que el array tiene 10 caracteres va a reservarme el espacio suficiente y necesario para ese array de ese tamaño (ni un caracter más ni uno menos)... lo entendí bien?

Por otro lado, un puntero reserva un tamaño en la memoria, por lo que su longitud es finita, por lo que me salta una duda, ¿cual es su límite? (me refiero a cuanto dato es capaz de almacenar, ya sean en caracteres o en número).

Y algo que me acabo de fijar, si un puntero reserva una memoria de 32 bits (es decir 4 octetos o bytes, lo que sería lo mismo que ocupa una direccion ip, es decir, cuatro números en decimal limitados por 255, espero que se entienda esto...) ¿como es posible que pueda memorizar la cadena "Hola mundo"?, ya de por si, asignando una letra por byte mediante ASCII y aún no hay memoria suficiente para guardar todas las letras.

Y último espero no molestar más, cuando defino:
Código C++:
Ver original
  1. char array[5]; //un vector de char de 5 posiciones
Por que no puedo despues hacer directamente.
Código C++:
Ver original
  1. array="Hola"; //forma incorrecta (aún teniendo 4 letras, que el compilador arroja error
Y para hacerlo bien tengo que introducir letra a letra en la correspondiente posición. No hay forma humana de introducirlo todo al mismo tiempo?? y para mostrar el array tambien tendría que mostrarlo letra a letra??

Gracias por sus respuestas de todas formas los punteros van quedando más o menos claros.
  #13 (permalink)  
Antiguo 22/03/2012, 05:15
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Cadenas en C/C++

Veo que no entendiste casi nada de lo que dije.... un puntero lo unico que tiene es una direccion.
Es como si yo te doy un papelito con la direccion de mi casa. No te estoy dando mi casa en el papelito solo te estoy dando la direccion, es decir, una ruta como llegar a mi casa.

Vos sabiendo la direccion de mi casa sos capaz de hacer muchas cosas. Sabes como llegar, me podes enviar una carta, etc.

Ahora volviendo a los punteros, este simplemente tiene la direccion donde se alojan los datos. Teniendo esa direccion uno es capaz de modificar o leer esos datos.

Ahora lo siguiente, un puntero , al igual que mi papelito, solo apunta a un dato . Si me quiero correr a la casa sigueinte o al caracter siguiente tengo que sumarle uno a la direccion. Eso se logra cuando ahcemos a[1]..a[2] a[3] etc...

Ahora porque no puedes hacer esto
char a[5];
a = "Hola";

Porque C/C++ son lenguajes de bajo nivel, cada uno administra su memoria. Eso lo que tiene de interesante C/C++ contra otras lenguajes. Pero obviamente al principio no te va a gustar nada eso.
Para copiar una cadena puede usar lo siguiente.

strcpy(a,"Hola");

Esta funcion internamente copia uno a uno cada caracter mediante un for.

Saludos
  #14 (permalink)  
Antiguo 22/03/2012, 05:43
Avatar de kurekshikam  
Fecha de Ingreso: marzo-2012
Ubicación: En casa
Mensajes: 13
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Cadenas en C/C++

Vale... ahora si lo entendí, un puntero solo apunta a una parte de la memoria...
y los array ya los voy pillando... c++ es más complejo de lo que imagine en un principio, no es como los demás lenguajes que he tratado...
thanks sam90

Etiquetas: cadenas, variables
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 22:07.