我有以下代码:
scanf(" %Xs %Ys", buf1, buf2);
Run Code Online (Sandbox Code Playgroud)
其中X和Y应该是整数.问题是X和Y的值是编译时常量,即使我想将值硬编码到格式字符串中,我也不能,因为我不知道值.在printf中,您可以使用"%*s"发送宽度变量和参数.scanf有什么类似的东西吗?
编辑:澄清一下,常量在编译时是已知的,但不是在编码时,而不是我.它们可能因平台或实施而异,并且在我完成后它们可能会发生变化.即使他们没有,我仍然不希望在格式字符串中重复缓冲区大小,准备在我忘记保持同步的那一刻发生段错误.
您可以使用sprintf()生成格式字符串:
sprintf( format, " %%%is %%%is", X, Y );
scanf(format, buf1, buf2);
Run Code Online (Sandbox Code Playgroud)
编辑:太棒了,但是下面的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 );
}
Run Code Online (Sandbox Code Playgroud)