C 使用snprintf避免缓冲区溢出
我不明白为什么我会得到这样的输出:StackOver↨< 由于snprintf应注意空终止,因为预期输出是叠加的。我正在使用devcppideC 使用snprintf避免缓冲区溢出,c,C,我不明白为什么我会得到这样的输出:StackOver↨< 由于snprintf应注意空终止,因为预期输出是叠加的。我正在使用devcppide #包括 #包括 #包括 内部主(空) { 字符缓冲区[10]; printf(“%d\n”,大小为(缓冲区)); snprintf(buffer,sizeof(buffer),“%s”,“StackOverflow”); printf(“%s”,缓冲区); 返回0; } 此代码对我来说运行良好。缓冲区只有10个字符的空间,因此sprintf只能写入您告诉
#包括
#包括
#包括
内部主(空)
{
字符缓冲区[10];
printf(“%d\n”,大小为(缓冲区));
snprintf(buffer,sizeof(buffer),“%s”,“StackOverflow”);
printf(“%s”,缓冲区);
返回0;
}
此代码对我来说运行良好。缓冲区只有10个字符的空间,因此sprintf只能写入您告诉它要写入的前9个字符(“StackOver”)。在第十个字符处,它存储一个以null结尾的字符,因为每个C字符串都必须以null结尾
我唯一的建议是在末尾打印字符串时添加一个换行符:
printf("%s\n", buffer);
末尾缺少换行符可能是IDE向您显示↨代码>字符
如果希望缓冲区适合“StackOverflow”,则需要将其分配到更大的位置。复制的字符串应以nul结尾:
7.21.6.5snprintf
功能
说明
snprintf
功能等同于fprintf
,除了
输出被写入数组(由参数s指定),而不是
去小溪。如果n为零,则不写入任何内容,s
可能是
空指针。否则,输出超出n-1
st的字符
被丢弃,而不是写入数组,和null
字符写在实际写的字符的末尾
进入阵列。如果复制发生在
重叠,则行为未定义
由于snprintf()
实现似乎没有正确实现所需的行为,您运行的C运行时库似乎过时和/或有缺陷。您是否考虑过检查snprintf
@EdHeal的返回值:您没有帮上忙……“StackOverflow”的长度为13个字符,但是你的缓冲区只有10个字符。这就是为什么会有这样的输出。为了完整起见,您可能需要更改printf(“%d\n”,sizeof(buffer))代码>进入printf(“%zu\n”,大小(缓冲区))
由于sizeof
的返回类型是size\u t
.FWIW,因此,在带有GCC 6.2的Linux/Debian/Sid/x86-64上,libc 2.24您的代码按其应有的方式运行,并显示StackOver
,而不显示新行。我强烈怀疑你的C标准库有缺陷。它没有帮助。我不知道为什么我总是得到相似的输出?你应该每次都得到那个输出。不涉及随机性。也许我不明白你到底想干什么?@hugomgi测试了一下,添加换行符会在OSX终端中为我删除一个奇怪的符号。我的IDE有问题吗?@CareyGregory:snprintf应该总是包含一个空终止符:MSVC的手册页对该函数的评论表明,它以前的工作方式类似于strncpy
,但C99不再如此。@WeatherVane Nice。C99已经有将近二十年的历史了。是的,MSVC就是在这里。OP的编译器可能也有那么旧。谢谢你。我已经浪费了很多时间来检查snprintf,就像你需要检查strncpy一样。很高兴听到它继续前进!
printf("%s\n", buffer);