Вы можете создать строку формата с помощью sprintf ():
sprintf( format, " %%%is %%%is", X, Y );
scanf(format, buf1, buf2);
РЕДАКТИРОВАТЬ: удивительно, но работает следующий код GCC:
#include <stdio.h>
#define LIST(...) __VA_ARGS__
#define scanf_param( fmt, param, str, args ) { \
char fmt2[100]; \
sprintf( fmt2, fmt, LIST param ); \
sscanf( str, fmt2, LIST args ); \
}
enum { X=3 };
#define Y X+1
int main(){
char str1[10], str2[10];
scanf_param( " %%%is %%%is", (X,Y), " 123 4567", (&str1, &str2) );
printf("str1: '%s' str2: '%s'\n", str1, str2 );
}