如何使用 sscanf() 中的宏定义的可变宽度说明符
How can I use variable width specifiers defined by a macro in sscanf()
我正在尝试根据 #define 在 sscanf() 调用中指定变量的宽度,该 #define 根据另一个 #define 计算其值。
当 TEST 定义只是一个数字时它可以工作,但是当它成为一个计算时,代码就会失败。让 TEST 调用另一个包含计算的函数也不起作用。
我正在使用的代码:
#include <stdio.h>
#define A 3
#define TEST FUN()
#define FUN() (A + 2)
#define STR(X) _STR(X)
#define _STR(x) #x
int main()
{
char input[] = "Test123";
char output[10];
sscanf(input, "%" STR(TEST) "s\n", output);
printf("%s\n", output);
return 0;
}
我在这里错过了什么?
你无法实现你问题中发生的算术运算。因此,在编译时以字符串形式评估为(3 + 2)
。
我的两分让人想起the post,
#define STRING_LENGTH 20
#define STR(x) _STR(x)
#define _STR(x) #x
{
...
fscanf(input, "%" STR(STRING_LENGTH) "s", output);
...
}
需要两个宏,因为如果您尝试直接使用 _STR
之类的东西,您只会得到字符串 "STRING_LENGTH"
而不是它的值。
更多click here and an example.
只需在执行期间构建 scanf
格式字符串。例如:
const int width_modifier = FUN();
char fmt[100] = {0};
snprintf(fmt, sizeof(fmt), "%%%ds\n", width_modifier);
sscanf(input, fmt, output);
What am I missing here?
预处理器进行文本替换,不进行计算。所以 "%" STR(TEST) "s\n"
扩展为包含 "%" "3 + 2" "s\n"
的字符串,连接后为 "%3 + 2s"
,这是无效的 scanf
格式字符串。
或者,您可以使用其他程序来准备要编译的源文件。一个流行的用途是预处理器,它在编译之前对文件进行预处理,并且能够计算算术。一个流行的选择是 m4:
m4_define(`A', 3)
m4_define(`FUN', `eval(A + 2)')
#include <stdio.h>
#define STR(X) #X
int main() {
printf("%s", STR(FUN()));
}
用m4
预处理并编译后输出5
.
我正在尝试根据 #define 在 sscanf() 调用中指定变量的宽度,该 #define 根据另一个 #define 计算其值。
当 TEST 定义只是一个数字时它可以工作,但是当它成为一个计算时,代码就会失败。让 TEST 调用另一个包含计算的函数也不起作用。
我正在使用的代码:
#include <stdio.h>
#define A 3
#define TEST FUN()
#define FUN() (A + 2)
#define STR(X) _STR(X)
#define _STR(x) #x
int main()
{
char input[] = "Test123";
char output[10];
sscanf(input, "%" STR(TEST) "s\n", output);
printf("%s\n", output);
return 0;
}
我在这里错过了什么?
你无法实现你问题中发生的算术运算。因此,在编译时以字符串形式评估为(3 + 2)
。
我的两分让人想起the post,
#define STRING_LENGTH 20
#define STR(x) _STR(x)
#define _STR(x) #x
{
...
fscanf(input, "%" STR(STRING_LENGTH) "s", output);
...
}
需要两个宏,因为如果您尝试直接使用 _STR
之类的东西,您只会得到字符串 "STRING_LENGTH"
而不是它的值。
更多click here and an example.
只需在执行期间构建 scanf
格式字符串。例如:
const int width_modifier = FUN();
char fmt[100] = {0};
snprintf(fmt, sizeof(fmt), "%%%ds\n", width_modifier);
sscanf(input, fmt, output);
What am I missing here?
预处理器进行文本替换,不进行计算。所以 "%" STR(TEST) "s\n"
扩展为包含 "%" "3 + 2" "s\n"
的字符串,连接后为 "%3 + 2s"
,这是无效的 scanf
格式字符串。
或者,您可以使用其他程序来准备要编译的源文件。一个流行的用途是预处理器,它在编译之前对文件进行预处理,并且能够计算算术。一个流行的选择是 m4:
m4_define(`A', 3)
m4_define(`FUN', `eval(A + 2)')
#include <stdio.h>
#define STR(X) #X
int main() {
printf("%s", STR(FUN()));
}
用m4
预处理并编译后输出5
.