Tengo una función que hace una serie de llamadas a sscanf()
y luego, después de cada, actualiza el puntero de cadena para que apunte al primer carácter no consumida por sscanf()
así:función de envoltura sscanf para avanzar puntero de cadena en C
if(sscanf(str, "%d%n", &fooInt, &length) != 1)
{
// error handling
}
str+=length;
con el fin de limpiarlo y evitar la duplicación de esto varias veces, me gustaría resumir esto en una función de utilidad agradable que se ve algo como lo siguiente:
int newSscanf (char ** str, const char * format, ...)
{
int rv;
int length;
char buf[MAX_LENGTH];
va_list args;
strcpy(buf, format);
strcat(buf, "%n");
va_start(args, format);
rv = vsscanf(*str, buf, args, &length); //Not valid but this is the spirit
va_end(args);
*str += length;
return rv;
}
Entonces podría simplificar las llamadas como abajo para remo ve el parámetro adicional/contabilidad:
if(newSscanf(&str, "%d", &fooInt) != 1)
{
// error handling
}
Por desgracia, no puedo encontrar una manera de añadir el parámetro &length
al final de la lista arg directamente o no dentro newSscanf()
. ¿Hay alguna manera de solucionar este problema, o estoy tan bien manejando la contabilidad a mano en cada llamada?
Tendrá que darse por vencido en sscanf(). Escriba analizadores dedicados que analicen un tipo específico. strtod, strtol, strtok son tus armas básicas. –