2

我有一些像这里的代码:

#define MAXSIZE 100

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

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

4

1 回答 1

3

有,但你最好使用fgets()

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

这样做的好处(除了毫无疑问的可读性提升)是正确fgets()处理大小,即它解释了终止 0 字符(没有),所以你不必乱加一个到声明缓冲区时的大小。它也总是为您终止数组。更不容易出错。scanf()


至于最初的问题:尝试通常的“stringify”技巧:

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

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

但这很丑陋,不是吗?

于 2013-10-16T17:25:20.360 回答