Могу ли я использовать scanf для захвата директивы с шириной, указанной переменной? - PullRequest
2 голосов
/ 11 октября 2009

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

scanf(" %Xs %Ys", buf1, buf2);

Где X и Y должны быть целыми числами. Проблема в том, что значения для X и Y являются константами времени компиляции, и даже если бы я хотел жестко закодировать значения в строку формата, я не смогу, потому что я не знаю значений. В printf вы можете отправить переменную ширины вместе с аргументами "% * s". Есть что-нибудь аналогичное для scanf?

РЕДАКТИРОВАТЬ: Чтобы уточнить, константы известны во время компиляции , но не во время кодирования , и не я вообще. Они могут варьироваться в зависимости от платформы или реализации, и они могут измениться после того, как я закончу. Даже если бы они этого не сделали, я все равно не хотел бы, чтобы размеры буфера дублировались в строках формата, готовых к сегфоуту в ту минуту, когда я забываю синхронизировать их.

Ответы [ 3 ]

7 голосов
/ 11 октября 2009

Вы можете создать строку формата с помощью 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 );
}
4 голосов
/ 11 октября 2009

Проблема в том, что значения для X и Y - константы времени компиляции

Затем используйте функцию вставки макроса:

#include <stdio.h>

#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;
}
0 голосов
/ 11 октября 2009

Ваш вопрос не ясен. Если вы не знаете значения, то они, вероятно, константы времени выполнения , а не константы времени компиляции.

Если это так (т. Е. Они являются постоянными во время выполнения), то нет, такой функции в scanf нет. Единственное, что вы можете сделать, - это создать полную строку формата (с конкретными значениями, встроенными в нее) во время выполнения с помощью «sprintf», а затем передать эту строку формата в «scanf».

...