C++字符串/字符*串联

C++ string/char* concatenation

本文关键字:串联 字符 字符串 C++      更新时间:2023-10-16

我写了一个小函数来接受一个"字符串"并记录它。

void
IPC::bomb (char * msg) {  /* etc */ }

这个调用它的实例没有编译:

bomb( __FUNCTION__": socket() call failed: " + strerror(errno));

诊断:

./c/IPC.cpp:26: error: expected ')' before string constant
./c/IPC.cpp:26: error: invalid conversion from 'const char*' to 'char*'

我很困惑如何有效地使用引用的文字,std::string,char*,以及constness是如何融入其中的。我该如何解决上述问题?一般来说,字符串串接是否有一些经验法则,尤其是在混合char*和字符串时?

UPDATE 1:可能还有另一个问题在起作用:C预处理器显示了这个扩展:

bomb( std::string(__FUNCTION__ ": socket() call failed: ") + strerror((*__errno_location ())));

您的函数签名是为接受char*而设计的。但是,值"string1" + ...是一个const char*,因为它是一个临时对象。将您的函数签名更改为IPC::bomb(const char* msg),它应该是可以的。

顺便说一句,不能只使用运算符+连接两个C风格的字符串,因为它只执行指针运算。请尝试使用std::string,将所有字符串强制转换为此类型。

因此,这个例子可能看起来像

void IPC::bomb (const std::string& msg) {  /* etc */ }
bomb(std::string(__FUNCTION__": socket() call failed: ") + 
     std::string(strerror(errno)));

如果使用字符串。

Edit:我不能简单地通过将__FUNCTION__"somestring"放在一起来连接它们。我用的是mingw编译器。

因此,为了安全起见,将所有三个部分连接在一起,如下所示:

bomb( string(__FUNCTION__) + ": socket() call failed: " + string(strerror(errno)) );

void IPC::bomb (char * msg)更改为void IPC::bomb (const char * msg)以消除第二个错误,这样它就可以接受要保护的常量字符串,使其免受任何修改。

如果将IPC::bomb更改为IPC::bomb(const std::string& msg),则可以执行:

bomb(std::string(__FUNCTION__) + ": socket() call failed: " + strerror(errno));

并且没有任何错误。

这里有一个完整的程序来做一些类似的事情:

#include <string>
#include <iostream>
#include <cstring>

void func(std::string str)
{
    std::cout << str << std::endl;
}
int main() {
    func(std::string(__FUNCTION__) + ":Some string " + strerror(2)); 
    return 0;
}

不能将c字符串(char*字符串)与+运算符连接(除非要编写重载运算符)。您必须创建一个足够长的新字符串来包含要组合的两个字符串,然后用memcpystrncpy或类似的东西手动复制它们。