Если не считать выяснения того, как списки переменных работают под прикрытием (и, следовательно, сделать ваш код непереносимым), изменить аргументы невозможно.
Но у меня была одна мысль, которая может или не может работать. Я не проверял это, так как я действительно не думаю, что вы должны использовать это, но, если вы одержимы этим, это может помочь.
Поскольку вы просто хотите получить количество отсканированных символов, вы должны понимать, что вам не нужно делать это одновременно с фактической настройкой переменных вызывающей стороны.
Пусть ваш код отсканирует строку, чтобы установить аргументы в соответствии с требованиями вызывающей стороны. Там вообще не нужно никаких изменений.
Следующий этап - немного хитрый.
Подсчитайте количество %
символов в строке формата, за которыми сразу же не следует %
или *
- другими словами, количество переменных, которые необходимо указать для sscanf
. Подтвердите, превышает ли это ваш верхний предел (см. Код ниже).
Затем добавьте последовательности %n
в конец строки формата, чтобы получить количество символов.
Затем, используя новую строку формата, используйте ненужный буфер (несколько раз), чтобы получить все значения из сканирования, включая последнее (количество символов).
Примерно так (ответственность за отладку лежит на вас):
typedef union {
char junk[512]; // Be *very* careful with "%s" buffer overflows.
int length;
} tJunkbuff;
int newSscanf (char **str, const char *format, ...) {
int rv, length;
char buf[MAX_LENGTH];
tJunkBuff junkbuff;
va_list args;
// Populate variables.
va_start (args, format);
rv = vsscanf (*str, buf, args);
va_end (args);
// Get length.
// String scanning for % count and assert/error left out.
// Only 20 allowed (depends on number of jb.junk variables below (n-1)).
strcpy (buf, format);
strcat (buf, "%n");
sscanf (*str, buf,
jb.junk,jb.junk, jb.junk, jb.junk, jb.junk,
jb.junk,jb.junk, jb.junk, jb.junk, jb.junk,
jb.junk,jb.junk, jb.junk, jb.junk, jb.junk,
jb.junk,jb.junk, jb.junk, jb.junk, jb.junk,
jb.junk); // May need to be "&(jb.junk)" ?
*str += jb.length;
return rv;
}
Мне было бы интересно услышать, как все пойдет, если вы решите попробовать. Это моя работа (и ответственность) сделано. Я рад продать вам бензопилу, но, если вы отрежете ногу во время использования, это ваша проблема: -)