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.

Convertir “4W2R” a “WWWWRR” Error – Excepción lanzada: violación de acceso de escritura

El objetivo del programa es convertir una cadena como esta – “4R2W5X” en esto -> ‘RRRRWWXXXXX’

Obtuve una plantilla de un código preparado y tuve que completar los espacios vacíos, puede notar que no estoy usando todas las variables que me dan en la plantilla.

Tengo un error cuando trato de ejecutar esto (marcaré la línea de error en el código) – violación de acceso

La plantilla sin mis respuestas está abajo, puede ver dónde se pide completar el espacio vacío.

void decode(char* source, char* dest)
{
    int digit; 
    char* chr = " ";
    int expander;
    int legal <em>digit;
    char* original</em> dest = dest;

if ((digit = atoi(source)/10)!=0) // Rellenar (1)
{
    strcpy(dest, "ERROR: número impar de caracteres\n");
}
else
{
    while ((*source >= '0') && (*source <= '9'))
    {
        *chr = *source; // Aquí es donde obtengo el error.
        source++;
        digit = atoi(source); // Rellenar (2)
        for (expander = 0; expander < digit; expander++)
        {
            *dest = *chr; // Rellenar (3)
            dest++;
        }
        source++;
    }
    if (*source == '\0')
    {
        *dest = '\0';
    }
    else
    {
        strcpy(original_dest, "ERROR: no se encontró un dígito donde se esperaba"); // Rellenar (4)
    }
}
}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución

    El error se debe a que *chr no ha sido inicializada y está apuntando a una ubicación de memoria inválida. Es necesario asignarle memoria antes de asignarle un valor.

    El código correcto para la función decode es el siguiente:

    void decode(char* source, char* dest)
    {
        int digit;
        char chr;
        int expander;
        int legal_digit;
        char* orginal_dest = dest;
    
        if ((strlen(source) % 2) != 0) // verifica si source tiene un número impar de caracteres
        {
            strcpy(dest, "ERROR: número impar de caracteres\n");
        }
        else
        {
            while ((*source >= '0') && (*source <= '9'))
            {
                chr = *source++;
                digit = atoi(source++);
                for (expander = 0; expander < digit; expander++)
                {
                    *dest++ = chr;
                }
            }
            if (*source == '\0')
            {
                *dest = '\0';
            }
            else
            {
                strcpy(orginal_dest, "ERROR: dígito no encontrado donde se esperaba");
            }
        }
    }
    

    Los cambios realizados en el código son los siguientes:

    • char* chr se cambió a char chr.
    • La verificación de si el número de caracteres es impar o par ahora se realiza mediante la función strlen.
    • atoi(*source) se cambió a atoi(source++).
    • *chr se cambió a chr.
    • *dest se cambió a *dest++ para pasar al siguiente elemento del array dest.

    Con estos cambios, el programa podrá convertir una cadena como “4R2W5X” en “RRRRWWXXXXX”.

Comments are closed.