- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在某些情况下,我确实需要 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/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!