2

我有以下代码:

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

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

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

4

3 回答 3

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 );
}
于 2009-10-11T05:27:45.690 回答
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;
}
于 2009-10-11T05:23:25.543 回答
0

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

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

于 2009-10-11T06:35:27.100 回答