我可以使用scanf捕获具有变量指定宽度的指令吗?

时间:2009-10-11 05:10:33

标签: c scanf

我有以下代码:

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

其中X和Y应该是整数。问题是X和Y的值是编译时常量,即使我想将值硬编码到格式字符串中,我也不能,因为我不知道值。在printf中,您可以使用“%* s”发送宽度变量和参数。 scanf有什么类似的东西吗?

编辑:为了澄清,常量在编译时已知,但不在编码时间,而不是我。它们可能因平台或实施而异,并且在我完成后它们可能会发生变化。即使他们没有,我仍然不希望在格式字符串中重复缓冲区大小,准备在我忘记保持同步的那一刻发生段错误。

3 个答案:

答案 0 :(得分:7)

您可以使用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 );
}

答案 1 :(得分:4)

  

问题在于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;
}

答案 2 :(得分:0)

你的问题不明确。如果你不知道这些值,那么它们可能是运行时常量,而不是编译时常量。

如果是这种情况(即他们是运行时间的合同),那么不,'scanf'中没有这样的功能。您唯一能做的就是在运行时使用'sprintf'生成完整的格式字符串(其中嵌入了具体值),然后将该格式字符串传递给'scanf'。