Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用snprintf避免缓冲区溢出_C - Fatal编程技术网

C 使用snprintf避免缓冲区溢出

C 使用snprintf避免缓冲区溢出,c,C,我不明白为什么我会得到这样的输出:StackOver↨< 由于snprintf应注意空终止,因为预期输出是叠加的。我正在使用devcppide #包括 #包括 #包括 内部主(空) { 字符缓冲区[10]; printf(“%d\n”,大小为(缓冲区)); snprintf(buffer,sizeof(buffer),“%s”,“StackOverflow”); printf(“%s”,缓冲区); 返回0; } 此代码对我来说运行良好。缓冲区只有10个字符的空间,因此sprintf只能写入您告诉

我不明白为什么我会得到这样的输出:StackOver↨< 由于snprintf应注意空终止,因为预期输出是叠加的。我正在使用devcppide

#包括
#包括
#包括
内部主(空)
{
字符缓冲区[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.5
snprintf
功能

说明

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);