gpt4 book ai didi

c - 如何使用#defined 常量作为 fscanf 中的最大字段宽度?

转载 作者:太空狗 更新时间:2023-10-29 17:21:08 24 4
gpt4 key购买 nike

所有这些都是在 C89 中,而不是 C99。

我有一个常数。

#define MAX_NAME_LEN 256

我想将它用作 fscanf 中的最大字段宽度,有点像这样。

fscanf(input, "%256s", name);

但我想使用 MAX_NAME_LEN 而不是文字 256 以保持良好的风格。我都试过了

fscanf(input, "%MAX_NAME_LENs", name);

char* max_name_len_str = malloc(16 * sizeof *max_name_len_str);
sprintf(max_name_len_str, "%d", MAX_NAME_LEN);
fscanf(input, "%" max_name_len_str "s", name);
free(max_name_len_str);

//works with printf, but has different meaning in scanf
fscanf(input, "%*s", MAX_NAME_LEN, name);

fscanf(input, "%%ds", MAX_NAME_LEN, name);

没有成功。

char* nameFormat = malloc(16 * sizeof *nameFormat); //I assume I don't ever want more than 10^13 characters in a name
sprintf(nameFormat, "%s%ds", "%", MAX_NAME_LEN);
fscanf(input, nameFormat, name);
free(nameFormat);

确实有效,但在所有问题上都显得笨拙。有没有更优雅的解决方案?

最佳答案

你可以使用这个宏:

#define STRINGIFY(X) INDIRECT(X)
#define INDIRECT(X) #X

像这样:

#define MAX 10
puts("%"STRINGIFY(MAX)"d");

这将打印 %10d

在你的情况下是

char name[MAX_NAME_LEN + 1];
fscanf(input, "%"STRINGIFY(MAX_NAME_LEN)"s", name);

宏中的 # 将它后面的内容字符串化(用 " 包围)。所以宏必须只是十进制数。
需要间接级别才能将 MAX_NAME_LEN 扩展到 256INDIRECT(MAX_NAME_LEN) 将扩展为 "MAX_NAME_LEN"

关于c - 如何使用#defined 常量作为 fscanf 中的最大字段宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44685730/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com