Strtok y la llamada de función
Pregunta
Tengo este comportamiento extremadamente extraño:
En el siguiente código: si comento la llamada a MyLogger, todo funciona bien, eso es que obtengo el tokenizado Stempnr y se imprimen 4 tokens. Pero si descompongo la llamada a MyLogger para registrar, solo la iteración tiene lugar una vez y en otra clase de prueba con un código similar al siguiente hay un bucle que tiene lugar más de 4 veces con información redundante que se envía a Mylogger.
Entonces, revisé con la herramienta Purify para determinar si había algunos problemas de memoria en Mylogger. No pude encontrar ninguno. MyLogger está usando VAARGS para extraer Args y VFPrintf Llamar para imprimir.
No estoy seguro de cómo depurar este código más. ¡Cualquier orientación sería apreciada!.
char sTempNr[41] = "1129Z13589.2.9.10";
char *sTempStr;
sTempStr = NULL;
sTempStr = strtok(sTempNr,".");
while (sTempStr)
{
printf("in in TempStr[%s]\n",sTempStr);
//MyLogger("write","","Temp String[%s]",sTempStr);
sTempStr = strtok(NULL,".");
}
Solución
strtok()
mantiene algunos datos estáticos dentro, por lo que probablemente MyLogger
llamadas strtok()
, ya sea directa o indirectamente.
Reemplazar strtok()
con strtok_r()
(Versión reentrante de strtok()
) para evitar este problema.
Otros consejos
¿Es el registrador llamando a Strtok?
¿Mylogger también está usando Strtok? Tenga en cuenta que Strtok no es apátrate.
Parece que Mylogger está corrompiendo la cadena en Stempstr. Intente imprimirlo nuevamente después de la llamada a MyLogger. p.ej
printf("in in TempStr[%s]\n",sTempStr);
MyLogger("write","","Temp String[%s]",sTempStr);
printf("in in TempStr[%s]\n",sTempStr);
y ver si algo ha cambiado