gpt4 book ai didi

c - 为什么当我们使用相同的源和目标时 sprintf 和 snprintf 的行为不同?

转载 作者:行者123 更新时间:2023-12-05 01:32:35 25 4
gpt4 key购买 nike

我有一个使用 sprintf 的简单代码

    #include <stdio.h>

int main()
{

char str_src [1024]={"Hello"};
sprintf(str_src,"%s%s",str_src,"hiiiiiiiiiii");
printf("result = %s",str_src);

}

当我编译时,我得到正确的结果:

result = Hellohiiiiiiiiiii



但是由于 sprintf 不安全,我决定将其更改为 snprintf。我以为这会很简单。我将 sprintf 更改为 snprintf,如下所示
snprintf(str_src,1024,"%s%s",str_src,"hiiiiiiiiiii");

现在如果我编译并运行代码,我会得到不同的结果

result = hiiiiiiiiiii



如果我使用 str_src 作为第四个参数(作为 %s 的值),我会遇到这个问题。令人惊讶的是,为什么 snprintf 的行为与 sprintf 不同?

最佳答案

使用相同的缓冲区作为目标和源是未定义的行为。

来自 C11 规范 (7.21.6.6/2):

If copying takes place between objects that overlap, the behavior is undefined.


snprintf也是如此(7.21.6.5/2),以及 va_list变体也是如此。

不幸的是,这在运行代码中很常见,但不能真正依赖它来工作。

关于c - 为什么当我们使用相同的源和目标时 sprintf 和 snprintf 的行为不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19490134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com