使用snprintf避免缓冲区溢出

时间:2017-01-08 16:27:21

标签: c

  

我不明白为什么我得到这样的输出:StackOver↨<因为snprintf应该处理空终止,因为预期的输出是StackOver。我正在使用devcpp IDE。

ls

2 个答案:

答案 0 :(得分:2)

复制的字符串应为空终止的C Standard states

  

7.21.6.5 snprintf功能

     

...

     

<强>描述

     

snprintf函数等同于fprintf,除了s   输出被写入数组(由参数s指定)而不是   到一个流。如果n为零,则不写入任何内容,n-1可能为a   空指针。否则,输出超出snprintf() st。的字符   被丢弃而不是被写入数组和null   字符写在实际写入的字符的末尾   进入数组。如果在对象之间进行复制   重叠,行为未定义。

由于aurelia-pal-browser@1.1.0实现似乎没有正确实现所需的行为,因此您似乎正在使用过时的和/或错误的C运行时库。

答案 1 :(得分:-1)

这段代码对我来说很好。缓冲区只有10个字符的空间,因此sprintf只能写出你要写的前9个字符(&#34; StackOver&#34;)。在第十个字符处,它存储一个终止空字符,因为每个C字符串必须以空值终止。

我要做的唯一建议是在最后打印字符串时添加换行符:

printf("%s\n", buffer);

最后缺少换行符可能是您的IDE向您显示字符的原因。

如果你想让缓冲区适合&#34; StackOverflow&#34;你需要把它分配给更大的东西。