2013-03-26 3 views
1
void mscanf(char *format, ...) 
{ 
    scanf(format); 
} 
int main() 
{ 
    int n1, n2; 
    mscanf("%d%d", &n1, &n2); 
    printf("%d,%d\n", n1, n2); 
    return 0; 
} 

Что случилось с этим.? Как я могу использовать scanf в функции так же, как это? спасибо.Как я могу использовать scanf в функции?

+0

Как имеет смысл просто передать один параметр scanf, va_list или нет? – Lundin

+1

@ Lundin: Это законный способ проверить, что вход - именно то, что вы ожидаете. Обычно это не очень полезно, но если вы, скажем, генерируете C-код из сценария, вы можете легко получить несколько тривиальных сканов между более полезными. – abarnert

+0

@abarnert Ах да, это правда. Тем не менее, я сомневаюсь, что это то, что пытался предпринять ОП. – Lundin

ответ

6

Вместо того, чтобы ваш scanf вы хотите vscanf:

va_list args; 
va_start(args, format); 
vscanf(format, args); 
va_end(args); 

При использовании функции с переменными аргументами список, вы иногда спотыкаются о необходимости передать эти переменные аргументы. Итак, в вашем примере вы знаете, что хотите, вы хотите «передать« ... »в scanf». Это именно то, что для функций , vprintf и т. Д. Предназначены для: они принимают «...» в виде va_list.

+0

спасибо, это работает. и почему нужно так использовать? –

+0

+1. Но вы можете действительно объяснить, для чего предназначен stdarg, и для чего предназначены функции v *, поэтому читатели OP и фьючерсов понимают, почему это работает, а не просто использует его как волшебный вызов. – abarnert

+0

@vito_yu: 'scanf' принимает переменные аргументы. C не дает возможности пересылать переменные аргументы из одной функции в другую. Но он дает возможность читать переменные аргументы в 'va_list', и (по крайней мере, с POSIX и/или C99) большинство функций с переменными аргументами в стандартной библиотеке имеют параллельные версии, которые начинаются с' v' и принимают 'va_list '. – abarnert

Смежные вопросы