У меня есть следующий код:
scanf(" %Xs %Ys", buf1, buf2);
Где X и Y должны быть целыми числами. Проблема в том, что значения для X и Y являются константами времени компиляции, и даже если я хотел бы жестко закодировать значения в строку формата, я не могу, потому что я не знаю значений. В printf вы можете отправить переменную ширины вместе с аргументами с «% * s». Есть ли что-то аналогичное для scanf?
EDIT: Чтобы уточнить, константы известны во время компиляции , но не во время кодирования , а не от меня вообще. Они могут варьироваться в зависимости от платформы или реализации, и они могут измениться после того, как я закончу. Даже они этого не сделали, я все равно не хочу, чтобы размеры буфера дублировались в строках формата, готовые к тому, что я забыл синхронизировать их.
Вы можете создать строку формата с помощью sprintf ():
sprintf( format, " %%%is %%%is", X, Y ); scanf(format, buf1, buf2);
EDIT: удивительно, но работает следующий код gcc:
#include #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 ); }
Проблема в том, что значения для X и Y являются константами времени компиляции
Затем используйте функцию макро-вставки:
#include #define TEST 2 #define CONST_TO_STRING_(x) #x #define CONST_TO_STRING(x) CONST_TO_STRING_(x) int main() { printf("1 " CONST_TO_STRING(TEST) " 3\n"); return 0; }
Ваш вопрос непонятен. Если вы не знаете значения, то это, вероятно, константы времени выполнения , а не константы времени компиляции.
Если это так (т. Е. Они являются постоянными), то нет, в «scanf» нет такой функции. Единственное, что вы можете сделать, это создать полную строку форматирования (с конкретными значениями, встроенными в нее) во время выполнения, используя «sprintf», а затем передать эту строку формата вашему «scanf».