c - 既然我们有 snprintf,为什么我们没有 snscanf?

标签 c posix

我有snprintf,它可以避免缓冲区溢出,但是为什么没有snscanf函数呢?

代码:

int main()
{
     char * src = "helloeveryone";
     char buf1[5];
     sscanf(src,"%s",buf1); // here is a  array out of bounds

}

所以,我认为还需要一个snscanf。为什么我们只有 snprintf

最佳答案

C11 的有争议的(和可选的)附件 K 添加了一个 sscanf_s 函数,该函数在指针参数之后采用 rsize_t 类型的附加参数(也在附件 K 中定义) , 指定指向数组的大小。无论好坏,这些功能都没有得到广泛支持。您可以通过将大小放在转换说明符中来获得相同的结果,例如

char out[20];
sscanf(in, "%19s", out);

但如果目标对象的大小可能在运行时发生变化(您必须使用 snprintf 以编程方式构造转换说明符),这会很尴尬且容易出错。请注意,转换说明符中的字段宽度是要读取的最大输入字符数,并且 sscanf 还会为 %s 转换写入一个终止空字节,因此字段宽度你传递的必须严格小于目标对象的大小。

关于c - 既然我们有 snprintf,为什么我们没有 snscanf?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18368712/

相关文章:

c - A/C编译器是否在编译时执行移位操作?

c - 如何在单链表 (C) 中正确地添加一个 int?

c - 什么时候应该使用 mmap 进行文件访问?

c - 通过管道向子进程写入和读取不起作用

C++ 使用信号量代替忙等待

检查给定数字是否是 2 个数组中两个数字的总和

c - 用链表表示稀疏矩阵

c - 程序在一台服务器上编译,在另一台服务器上不编译

c - POSIX C 中的打开功能不起作用

c - Posix在父进程和子进程之间共享内存?