Это одно из самых досадных несоответствий между семействами *printf()
и *scanf()
.По какой-то причине вы можете использовать подстановочные знаки в *printf()
спецификаторах преобразования и указывать для них значения в списке аргументов, но для *scanf()
нет эквивалента.
Как ни страшно, я бы предпочел использовать отдельную операцию sprintf()
для построения строки форматирования, а не полагаться на макросы строки:
#define LENGTH 20
char word[LENGTH+1];
char format[5];
sprintf(format, "%%%ds", LENGTH);
fscanf(file, format, word);
По крайней мере, это несколько интуитивно понятный;как указывает Торак, вы должны пройти два уровня косвенного обращения с макросами для строковой обработки (поскольку вы не хотите структурировать макрос, а то, что макрос расширяет до ).