scanf:内置宏(#define常量)的模板

时间:2013-10-16 17:22:32

标签: c scanf

我有一些像这里的代码:

#define MAXSIZE 100

int main() {
    char str[MAXSIZE+1];
    scanf("%100s", str);
    ...

问题是我仍然有“幻数”100,虽然定义了MAXSIZE。 有没有办法正确“插入”MAXSIZE到scanf格式字符串? (纯C,c-99标准)

1 个答案:

答案 0 :(得分:3)

有,但你最好使用fgets()

if (fgets(str, sizeof str, stdin) != NULL) {
    // process input
}

关于这一点的好处(除了毫无疑问的可读性提升)是fgets()正确处理的大小, i。即它解释了终止0字符(scanf()没有),所以你不必在声明缓冲区时添加一个大小。它也始终为NUL终止阵列。不那么容易出错。


关于原始问题:尝试通常的“stringify”技巧:

#define REAL_STRINGIFY(x) #x
#define STRINGIFY(x) REAL_STRINGIFY(x)

scanf("%" STRINGIFY(MAXSIZE) "s", str);

但这非常难看,不是吗?