将std :: string转换为C*函数的char*时需要注意什么?

Ton*_*ion 12 c c++ string c++-faq char

我已经阅读了许多帖子,询问有关如何转换C++ std::stringconst std::string&将其char*传递给C函数的问题,而且似乎有很多关于这样做的警告.一个人必须要注意字符串是连续的和许多其他东西.关键是我从来没有真正理解需要注意的所有要点以及为什么

我想知道,如果有人可以总结告诫和挫折有关从做一个转换std::stringchar*所需要传递给C函数?

当它std::string是一个const引用时,它只是一个非const引用,当C函数char*改变它时,它什么时候不会改变它.

Jam*_*nze 11

首先,const引用或值是否不会改变任何东西.

然后,您必须考虑该功能的期望.函数可以使用char*或者有一些不同的东西char const*- memcpy例如,使用这些类型的原始版本,并且可能仍然存在这样的代码.希望是罕见的,在下文中,我将假设char*C函数中的函数引用'\0' 终止字符串.

如果C函数采用a char const*,则可以将结果传递给std::string::c_str(); 如果它需要char*,它取决于.如果只需要一个char*因为它可以追溯到constC 的前几天,事实上,它什么都没有修改, std::string::c_str()接着是一个const_cast合适的.但是,如果C函数使用char*out作为out参数,则事情变得更加困难.我个人更喜欢声明一个char[]缓冲区,传递它,然后将结果转换为std::string,但所有已知的实现std::string使用连续的缓冲区,并且标准的下一个版本将需要它,因此正确地标注第std::string一个(使用 std::string::resize(),然后传递&s[0],和然后strlen(s.c_str()),也可以使用将字符串重新标注到结果长度(如果需要,使用,确定).

最后(但这也是C程序使用的问题 char[]),你必须考虑任何生命周期问题.大多数函数接受char*char const*只是使用指针,并忘记它,但如果函数将指针保存在某处,供以后使用,字符串对象必须至少存活一段时间,并且在此期间不应修改其大小.(同样,在这种情况下,我更喜欢使用char[].)


Kon*_*lph 6

基本上,有三点很重要:

  • 根据当前的标准,std::string实际上并不保证使用连续存储(据我所知这是由于变化).但实际上,所有当前的实现都可能使用连续存储.出于这个原因,c_str()(和data())可能实际上在内部创建了一个字符串的副本 ...

  • 只有在原始字符串上没有调用非const方法时,由c_str()(和data())返回的指针才有效.当C函数挂起指针时(这与在实际函数调用期间仅使用它相反),这使得它的使用不合适.

  • 如果有任何机会可以修改字符串,那么从中删除常量c_str()并不是一个好主意.您必须创建一个包含该字符串副本的缓冲区,并将其传递给C函数.如果您创建缓冲区,请记住添加空终止.