- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我读过很多帖子,询问如何将 C++ std::string
或 const std::string&
转换为 char*
将其传递给 C 函数,似乎有很多关于这样做的警告。必须注意字符串是连续的以及许多其他事情。关键是我从来没有真正理解所有需要注意的点以及为什么?
我想知道是否有人可以总结从 std::string
到需要传递给 C 的 char*
转换的注意事项和缺点功能?
当 std::string
是一个 const
引用并且它只是一个非常量引用并且 C 函数将改变 char 时*
以及何时不会改变它。
最佳答案
首先,无论是 const 引用还是 value 都不会改变任何东西。
然后您必须考虑函数的期望。那里是函数可以用 char*
或a char const*
---memcpy
的原始版本,用于例如,使用了这些类型,并且可能仍然存在这样的代码。希望这是罕见的,在下文中,我将假设 C 函数中的 char*
引用 '\0'
终止的字符串。
如果 C 函数采用 char const*
,您可以将std::string::c_str()
的结果;如果它需要一个 char*
,它要看。如果它需要一个 char*
仅仅是因为它的日期来自C 的const
天之前,实际上,它没有修改任何内容,std::string::c_str()
后跟 const_cast
是合适的。如果 C 函数使用 char*
作为输出参数,然而,事情变得更加困难。我个人更喜欢声明一个 char[]
缓冲区,传递这个,然后将结果转换为 std::string
,但都是已知的std::string
的实现使用一个连续的缓冲区,并且标准的下一个版本将需要它,所以正确首先确定 std::string
的尺寸(使用std::string::resize()
,然后通过 &s[0]
,然后将字符串重新调整为结果长度(确定using strlen(s.c_str())
,如果需要)也可以使用。
最后(但这也是 C 程序使用的问题char[]
),你必须考虑任何生命周期的问题。最多采用 char*
或 char const*
的函数只需使用指针,忘记它,但如果函数保存指针某处,供以后使用,字符串对象必须至少存在长,并且在此期间不应修改其大小。(同样,在这种情况下,我更喜欢使用 char[]
。)
关于c++ - 将 std::string 转换为 C 函数的 char* 时要注意什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5632572/
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
我是一名优秀的程序员,十分优秀!