¿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);
}
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 deaddNumberSignToString
que demuestra este enfoque:Ten en cuenta que también hemos agregado un bucle para reemplazar los caracteres
\0
por#
, y usamosstrdup
para devolver una copia del búfer modificado (que posteriormente debe ser liberado confree
).