es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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;

    cout << "Ingrese el número de equipos: ";
    cin >> numberOfTeams;
    
    char** Teams = new char*[numberOfTeams];
    
    // Asignar memoria dinámicamente para cada cadena
    for(int i = 0; i < numberOfTeams; i++) {
        int stringLength;
        cout << "Ingrese la longitud de la cadena " << i + 1 << ": ";
        cin >> stringLength;
        Teams[i] = new char[stringLength + 1]; // Asignar memoria para la cadena + 1 para el terminador nulo
        cout << "Ingrese la cadena " << i + 1 << ": ";
        cin >> Teams[i];
    }
    
    // Mostrar las cadenas
    for(int i = 0; i < numberOfTeams; i++) {
        cout << Teams[i] << endl;
    }
    
    // Liberar la memoria de cada cadena y el array de punteros
    for(int i = 0; i < numberOfTeams; i++) {
        delete[] Teams[i];
    }
    delete[] Teams;
    
    return 0;
    

    }
    “`

    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 utilizando cin >> 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 utilizando delete[] para liberar el array de punteros.

Comments are closed.