【发布时间】:2019-04-03 21:28:56
【问题描述】:
我可以使用这种技术指定scanf 读取到buffer 的最大字符数:
char buffer[64];
/* Read one line of text to buffer. */
scanf("%63[^\n]", buffer);
但是如果我们在编写代码时不知道缓冲区长度怎么办?如果是函数的参数呢?
void function(FILE *file, size_t n, char buffer[n])
{
/* ... */
fscanf(file, "%[^\n]", buffer); /* WHAT NOW? */
}
此代码容易出现缓冲区溢出,因为fscanf 不知道缓冲区有多大。
我记得以前看过这个,并开始认为这是解决问题的方法:
fscanf(file, "%*[^\n]", n, buffer);
我的第一个想法是"%*[*^\n]" 中的* 意味着传递了一个参数的最大字符串大小(在本例中为n)。这就是printf中*的含义。
当我查看scanf 的文档时,我发现这意味着scanf 应该丢弃[^\n] 的结果。
这让我有些失望,因为我认为能够为scanf 动态传递缓冲区大小将是一个非常有用的功能。
有什么方法可以将缓冲区大小动态传递给scanf?
【问题讨论】:
-
size_t n没有给出缓冲区大小吗? -
IMO,可能的重复不是很准确的重复。