gpt4 book ai didi

c++ - 如何使用 strncpy_s() 函数实现 strncpy() 功能?

转载 作者:可可西里 更新时间:2023-11-01 18:27:39 28 4
gpt4 key购买 nike

在某些情况下,我确实需要 strncpy() 功能 - 例如,我在预定义接口(interface)中有一个函数,它传递了缓冲区的地址和缓冲区的大小:

HRESULT someFunction( char* buffer, size_t length );

据记载,我可以在那里复制一个长度不超过 length 的以 null 结尾的字符串 - 如果它的长度正好是 length 我不为 null - 终止字符串,调用者知道字符串以空字符或长度 length 结束,以先发生者为准,一切正常。

当然我会为此使用strncpy()

HRESULT someFunction( char* buffer, size_t length )
{
const char* toCopy = ...
size_t actualLength = strlen( toCopy );
if( actualLength > length ) {
return E_UNEXPECTED; // doesn't fit, can't do anything reasonable
}
strncpy( buffer, toCopy, length );
return S_OK;
}

现在我有了这段代码,需要将它从 Visual C++ 7 迁移到 Visual C++ 9。我编译它并 see a warning that strncpy() is unsafe我应该改用 strncpy_s() .

strncpy_s() 旨在始终以 null 终止缓冲区,因此我不能将其用作上述场景中的直接替代品。我必须在长度超过 length - 1 的字符串上返回 E_UNEXPECTED(不是以前的 length),否则它只会触发无效参数错误一旦字符串的长度为 length 或更长时处理程序,否则程序将遇到未定义的行为。

目前我采用的解决方案是定义一个 _CRT_SECURE_NO_WARNINGS 并让编译器关闭。

有没有办法使用 strncpy_s() 作为 strncpy() 的实际替代品?

最佳答案

你在这里面临的问题是你的函数本身是不安全的,就像 strncpy() 一样。这是不安全的,因为您的函数的调用者可能会忘记返回的字符串不是空终止的。如果这确实是您的函数所需的行为,我建议不要定义 _CRT_SECURE_NO_WARNINGS 并全局禁用警告,而是使用 #pragmas:

// document here exactly why you can not use strncpy_s
#pragma warning( push )
#pragma warning( disable : 4996 )
// your code that uses strncpy instead of strncpy_s
#pragma warning( pop )

这样您就可以仅在绝对必须使用不安全函数的情况下禁用这些警告。

关于c++ - 如何使用 strncpy_s() 函数实现 strncpy() 功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5038614/

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