cin entrada del usuario para la asignación dinámica de una matriz de cadenas
Soy nuevo en esto, estoy aprendiendo C++, intento asignar dinámicamente un arreglo de cadenas e ingresar cada cadena por parte del usuario. Entonces, primero, el usuario ingresa la cantidad de cadenas y luego coloca cada cadena utilizando cin>>
.
int main() {
int numeroDeEquipos;
char** Equipos;
cout << "Ingrese el número de equipos " << endl;
cin >> numeroDeEquipos;
Equipos = new char* [numeroDeEquipos] ;
for (int i = 0; i < numeroDeEquipos; i++) {
cin >> Equipos[i];
}
delete[] Equipos;
return 0;
}
El programa me arroja un error después de ingresar una cadena con cin
. El error que obtengo es:
Exception thrown: write access violation.
_Str was 0xCEDECEDF.
No puedo usar la variable “string”, solo un arreglo de caracteres.
Gracias a todos.
davy.ai
El problema con el código dado es que solo se asigna memoria para el array de punteros a char (Teams), pero no se asigna memoria para las cadenas individuales que el usuario ingresa. Por lo tanto, cuando el programa intenta leer la entrada en la cadena, está accediendo a memoria no inicializada, lo que provoca una violación de acceso de escritura.
Para solucionar esto, se debe asignar memoria para cada cadena individual utilizando asignación de memoria dinámica. Aquí hay una versión actualizada del código que asigna memoria dinámicamente para cada cadena:
“`c++
#include
using namespace std;
int main() {
int numberOfTeams;
}
“`
En este código actualizado, se asigna memoria dinámicamente para cada cadena al solicitar al usuario la longitud de cada cadena, y luego asignar memoria para cada cadena utilizando
new char[stringLength + 1]
. El+1
es para asignar memoria para el carácter de terminación nula al final de la cadena. Luego, la cadena se lee en la memoria asignada utilizandocin >> Teams[i]
.Cuando se muestran las cadenas, simplemente se muestra
Teams[i]
ya que ahora es una cadena terminada en nulo.Finalmente, se debe liberar toda la memoria que se asignó dinámicamente para evitar fugas de memoria. Esto se hace iterando a través de cada cadena y utilizando
delete[]
para liberar la memoria asignada, y luego utilizandodelete[]
para liberar el array de punteros.