La función strtok() de ANSI C

Preparando la nueva asignatura de Diseño y Administración de Base de Datos me topé con la necesidad de generar una cantidad suficiente de datos para poblar la base de datos que utilizaré como caso de estudio en la asignatura. La generación aleatoria pero consistente de información requiere trabajar con cadenas de texto que es preciso interpretar y procesar. Mis ficheros de texto contienen una línea de texto por registro y los campos de cada registro se separan mediante un  separador (por ejemplo «dni;nombre;edad;salario»). Una vez almacenado el registro en un array de caracteres, la función strtok(), incluída en la librería estandar <string.h>, permite separar en piezas (tokens) el string, facilitando el tratamiento de los campos individualmente. Despúes de haberlo utilizado a lo largo de todo el código sin problema alguno,  se me empieza a presentar uno de esos errores indeseables que interrumpen la ejecución sin ofrecer pistas aparentes y obligandome a introducir en el código fuente líneas //debug … //findebug para averiguar qué está provocando dicha interrupción. Después de dedicar mi precioso tiempo a esta ardua tarea, descubro que determinadas líneas de texto en el array de strings donde almaceno temporalmente los registros se modifican incomprensiblemente tras la llamada de strtok(). Salto del IDE al navegador y googleo a ver si encuentro algun remedio para mi incipiente dolor de cabeza. Luego de refinar varias veces mi pregunta, me topo finalmente con la respuesta: «The abominable strtok()«. Ahí está perfectamente explicado el comportamiento de esta función, a la vez que algunas sugerencias para evitar los efectos laterales del uso de esta función.

En mi caso, después de meditar el uso de la librería glib del proyecto Gnome que proporciona útiles para el manejo de strings, tal como g_strsplit para tokenizar un string, opté finalmente por utilizar un buffer temporal char linea[75] para recibir el string original almacenado en una fila del array de strings char regs[100][75] y aplicar la función strtok() sobre el buffer temporal para evitar que dicha función modifique la información original del array regs:

char linea[75], regs[100][75], *cp;
struct reg{
char dni[10],nombre[50];
unsigned char edad;
unsigned salario;
};

for(i=0;i<100;i++){
strcpy(linea,reg[i]);
cp = strtok(linea,»;»);
strcpy(dni, cp);
cp = strtok(NULL,»;»);
strcpy(nombre, cp);
cp = strtok(NULL,»;»);
edad = cp[0];
cp = strtok(NULL,»;»);
salario = atoi(cp);
}

Sigo con la tarea.

Acerca de barrena

Bienvenidos a este diario, semanario, mensuario o como quiera que se desee denominar a este espacio donde intento comunicar los hechos más relevantes de mi actividad académica.
Esta entrada fue publicada en Docencia, Software. Guarda el enlace permanente.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *