使用确定字符串长度的宏避免 scanf 处的缓冲区溢出

问题描述 投票:0回答:1

我有一个作业,我必须获取一个字符串输入,其长度不得大于 32。这个长度由一个名为

MAX_BUF_LEN
的宏给出。我在 StackOverflow 上找到了解决方案,其中这个限制是通过一个幻数给出的。但有什么办法可以避免这种情况吗?

我找到的解决方案是这样的:

char buf[MAX_BUF_LEN];
scanf("%"512"[^\n]", buf); 

此外,我发现这个解决方案在数字512前后都有引用标记;没有它。有什么区别吗

c macros scanf buffer-overflow
1个回答
0
投票

定义可以字符串化以在格式字符串中使用。
格式字符串中的值必须比数组的大小小 1。

#include <stdio.h>

#define MAX_BUF_LEN 512

// stringify to use in format string
#define FS(x) SFS(x)
#define SFS(x) #x

int main ( void) {
    char buf[MAX_BUF_LEN + 1]; // +1 to allow for terminating zero
    scanf("%"FS(MAX_BUF_LEN)"[^\n]", buf);
}
© www.soinside.com 2019 - 2024. All rights reserved.