Cadena C divide e imprime los tokens.

Estoy tratando de dividir la cadena e imprimir los tokens.

int main() { char line[255] = "182930101223, KLA1513"; char val1[16]; char val2[7]; strcpy(val1, strtok(line, ",")); strcpy(val2, strtok(NULL, ",")); printf("%s|%s\n", val1, val2); return 0; } 

Cuando imprimo me sale

  3| KLA1513 

en lugar de

182930101223 | KLA1513

¿Cual es el problema?

Bien, pensé que este era un problema no relacionado, pero ahora creo que es el problema que están viendo.

Es importante recordar que las cadenas C toman 1 carácter adicional del que contienen. Este es el carácter NUL de terminación ( \0 ), y marca el final del texto.

Entonces, KLA1513 es en realidad 8 caracteres ( KLA1513\0 ). Además, como no estás recortando espacios, ¡son 9 caracteres! _KLA1513\0 (_ es un espacio).

Eso significa que estás sobrepasando la memoria en tu segunda strcpy , lo que lleva a un comportamiento indefinido , que (te darás cuenta) es tu peor pesadilla.

Cuando lo imprime, quién sabe en qué estado se encuentra el progtwig. Tal vez la memoria que sobrescribió fue parte de la llamada de print , o tal vez se sobrescribió de nuevo y ahora no se termina var2 .

Simplemente haga var2 más grande (9 caracteres es suficiente aquí), y en el futuro, use las formas seguras ( strncpy , por ejemplo). Los errores de este tipo son la forma en que los hackers se las arreglan para comprometer los sistemas.

Prueba esto:

 #include  #include  int main() { char line[] = "182930101223, KLA1513"; char* val1; char* val2; val1 = strtok(line, ","); val2 = strtok(NULL, ","); printf("%s|%s\n", val1, val2); return 0; } 

No hay necesidad de strcpy() los tokens, solo puedes usar char* ; strtok() agregará un cierre \0 al final de cada token encontrado.

También es más seguro, porque no es necesario saber de antemano el tamaño de los tokens; y el tamaño de sus fichas era el problema. Si necesita tener el token en su propia memoria, puede copiarlos en cadenas de tamaño suficiente después.

Tenga en cuenta que no podemos hacer:

 char* line = "182930101223, KLA1513"; 

porque strtok() modifica la cadena, y no está permitido modificar una cadena C literal.