Autor
|
Tema: Problema con asignación de memoria en puntero de caracteres. (Leído 5,234 veces)
|
1t4h1s4
Desconectado
Mensajes: 6
|
Esto nunca me había pasado, y creo que me va a explotar la cabeza, porque he hecho esto otras veces y funcionaba perfectamente. Verán quiero hacer algo tan simple y sencillo como: char* a = new char[20]; Es decir, crear una cadena para almacenar 20 caracteres. Pues bien, cuando devuelvo el tamaño de mi variable a: cout << strlen(a); Me muestra 32!!!! es decir, que no me está creando una cadena de caracteres de la longitud que yo deseo. ¿Cómo es posible? Estoy desesperando, por favor, ayuda .
|
|
|
En línea
|
|
|
|
DickGumshoe
|
Hola. Si reservas memoria pero no pides datos, el programa fallará. Es decir, strlen() no dice el número de caracteres reservados, sino el de caracteres ocupados. Esto es porque strlen() cuenta caracteres hasta que encuentre un '\0'. En tu caso, te dio 32, porque 32 posiciones en memoria más allá de a[0] se encontraba '\0'. A mí me dio en este programa 3 por lo mismo: #include <string.h> #include <iostream> using namespace std; int main() { char* a = new char[20]; cout << strlen(a); }
Depende de lo que se encuentre en memoria en cada ordenador en un momento determinado. Sin embargo, cuando asignes algo a esa cadena, sí te dará la longitud, porque encontrará el '\0' que has asignado tú, y no lo que haya encontrado el ordenador por casualidad. Así sale bien: #include <string.h> #include <iostream> using namespace std; int main() { char* a = new char[20]; cout << strlen(a); cin >> a; cout << strlen(a); }
Un saludo.
|
|
« Última modificación: 11 Febrero 2013, 01:51 am por DickGumshoe »
|
En línea
|
|
|
|
1t4h1s4
Desconectado
Mensajes: 6
|
Gracias, muchas gracias, de verás. No entendía porque a veces funcionaba y a veces no.
|
|
|
En línea
|
|
|
|
DickGumshoe
|
De nada. Por cierto, mientras lo leías edité el mensaje con una explicación de por qué pasa eso, por si quieres saberlo.
|
|
|
En línea
|
|
|
|
1t4h1s4
Desconectado
Mensajes: 6
|
Ok, muchas gracias Aunque una última cosita, si quisiera hacerlo sin la librería string.h y sus métodos, sino crear yo mis propios métodos: por ejemplo: para saber la longitud de a se que me vale con lo siguiente: int i = 0; while (a[i] != NULL) i++;
luego para asignar esa misma longitud a b haría lo siguiente: b = new char[i+1]; for (int j = 0; j < i; j++) b[j] = a[j];
Pero el problema es que si imprimiera b con cout: me aparecería: holaxxxxxxxxxxx siendo x basura. ¿Cómo lo solucionaría? ¿No se supone que ya he igualado una cadena a otra? Sé que con strcpy funciona perfectamente, pero me gustaría saber hacerlo a mi manera. Intenté esto, marcarle yo el final: pero me falla en ejecución.
|
|
|
En línea
|
|
|
|
DickGumshoe
|
El bucle for que has creado debería tener como condición que j < i+1. La variable i representa la posición del último carácter "real" de la cadena, ahí no incluye el '\0'. Si le añades ese 1 también copia el '\0': for (int j = 0; j < i+1; j++) b[j] = a[j];
Así quedaría completo: #include <string.h> #include <iostream> using namespace std; int main() { char* a = new char[20]; char *b; int i = 0; cin >> a; while (a[i] != '\0') i++; b = new char[i+1]; for (int j = 0; j < i+1; j++) b[j] = a[j]; cout << b; }
|
|
|
En línea
|
|
|
|
1t4h1s4
Desconectado
Mensajes: 6
|
Gracias, me has solucionado mis dudas a la perfección Sé que son muy básicas, pero así voy aprendiendo así que gracias por tu atención, respuestas y útil solución. Eternamente agradecida
|
|
« Última modificación: 11 Febrero 2013, 03:16 am por 1t4h1s4 »
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
A todo esto, en C++ ya no se usan los char*. Es mucho más sencillo usar los strings: string Texto = "Hola mundo"; cout<<Texto<<endl<<Texto.size()<<endl; Texto = "Reducido"; // Los strings se ajustan automaticamente cout<<Texto<<end<<Texto.size();
Te olvidas de reservar memoria con new/delete, el solito se agranda y se reduce conforme lo vayas necesitando... También hay muchas funciones internas para tratar con ellos (buscar, concatenar...) http://www.cplusplus.com/reference/string/string/
|
|
|
En línea
|
|
|
|
0xDani
Desconectado
Mensajes: 1.077
|
@amchacon, estes en C o C++ para aprender nunca viene mal trabajar con arrays.
|
|
|
En línea
|
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!
I code for $$$ Hago trabajos en C/C++ Contactar por PM
|
|
|
1t4h1s4
Desconectado
Mensajes: 6
|
A todo esto, en C++ ya no se usan los char*. Es mucho más sencillo usar los strings
En este ejercicio concretamente, me pedían que utilizara el char*, no sé por qué, pero bueno, nunca está demás aprender como hacerlo así.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Ayuda asignacion de memoria dinámica palabras en c
« 1 2 3 »
Programación C/C++
|
newfag
|
24
|
13,725
|
19 Mayo 2010, 20:42 pm
por Eternal Idol
|
|
|
Codigo de asignacion de memoria: Peor Ajuste
Programación C/C++
|
dato000
|
5
|
12,495
|
15 Marzo 2011, 14:55 pm
por Akai
|
|
|
Asignación de memoria en C
Programación C/C++
|
Akkon
|
3
|
4,107
|
30 Abril 2011, 15:22 pm
por Akkon
|
|
|
Asignacion Dinamica Memoria
Programación C/C++
|
charmedever
|
5
|
3,728
|
21 Octubre 2011, 05:25 am
por charmedever
|
|
|
Problema operador asignación y operador asignación [struct] c++
Programación C/C++
|
luiggy2
|
2
|
3,033
|
16 Octubre 2013, 23:35 pm
por luiggy2
|
|