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.

¿Por qué estoy obteniendo el mensaje “Violación de acceso” al escribir en esta ubicación?

Estoy tratando de utilizar strtok para obtener una cadena con \0 en lugar de espacios para reemplazar el \0 con #, por lo que estoy usando strtok para eso. Pero obtengo un error de violación de acceso escribiendo la ubicación en esta línea: char* word = strtok(stringOfNumberSign, delimiters);.

char* addNumberSignToString(char* stringOfNumberSign)
{
    int numOfWords = 0;
    char* delimiters = " ";
    char* word = strtok(stringOfNumberSign, delimiters);
    while (word)
    {
        numOfWords++;
        word = strtok(NULL, delimiters);
    }

    return stringOfNumberSign;
}

int main()
{
    char* stringForNumberSign = "welcome to hello world";
    char* result;
    result = addNumberSignToString(stringForNumberSign);
    printf("%s", result);
}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema radica en el uso de la variable stringForNumberSign, que es una cadena literal. Las cadenas literales se almacenan en memoria de solo lectura y no se pueden modificar. Por lo tanto, cualquier intento de modificarlas puede generar un comportamiento indefinido, como errores de violación de acceso.

    Para solucionar este problema, puedes crear un búfer escribible para almacenar una copia de la cadena, y luego usar strtok en ese búfer para agregar los signos de número. Aquí tienes una implementación actualizada de addNumberSignToString que demuestra este enfoque:

    char* addNumberSignToString(char* stringOfNumberSign)
    {
        int numOfWords = 0;
        char* delimiters = " \0";
        char* word;
        char stringCopy[100]; // crea un búfer escribible para almacenar una copia de la cadena
        strcpy(stringCopy, stringOfNumberSign); // copia la cadena en el búfer
        word = strtok(stringCopy, delimiters); // usa el búfer con strtok
        while (word)
        {   
            numOfWords++;
            word = strtok(NULL, delimiters);
        }
    
        for (int i = 0; i < strlen(stringCopy); i++) {
            if (stringCopy[i] == '\0') {
                stringCopy[i] = '#';
            }
        }
    
        return strdup(stringCopy); // devuelve una copia del búfer modificado
    }
    
    int main()
    {
        char* stringForNumberSign = "bienvenido a hola mundo";
        char* result;
        result = addNumberSignToString(stringForNumberSign);
        printf("%s\n", result);
        free(result); // libera la memoria asignada por strdup
        return 0;
    }
    

    Ten en cuenta que también hemos agregado un bucle para reemplazar los caracteres \0 por #, y usamos strdup para devolver una copia del búfer modificado (que posteriormente debe ser liberado con free).

Comments are closed.