Intereting Posts
gcc linker – сопоставить все объектные файлы в архиве в определенном разделе Язык программирования C, Ч.1 Упражнение 1.10 (Getchar and Putchar) Зачем мне нужно несколько символов EOF (CTRL + Z)? Как отключить оптимизацию компилятора gcc для включения переполнения буфера Генерация случайных чисел экспоненциального распределения C – как разрешить эту ошибку при использовании pjsip? Печать квадратной матрицы с помощью указателей Естественная сортировка в C – “массив строк, содержащих числа и буквы” используя memcpy для копирования структуры Может ли IDE Arduino использоваться для разработки простых старых программ на C? В C почему вам нужно заявление после метки goto? Взаимодействие массивов Swift с C? Невозможно присвоить значения переменной и указателю Неподдерживаемый протокол с использованием Curl в C Ссылка на C Dll из Windows 10 Универсальное приложение на архитектуре процессоров

Могу ли я использовать scanf для захвата директивы с шириной, указанной переменной?

У меня есть следующий код:

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».