1

我是 C++ 新手,还没有完全掌握所有概念,所以我很困惑为什么这个函数不起作用。我目前不在家,所以我还不能发布编译器错误,我一回到家就会这样做。

这是功能。

const char * ConvertToChar(std::string input1, std::string input2) {
    // Create a string that you want converted
    std::stringstream ss;
    // Streams the two strings together
    ss << input1 << input2;
    // outputs it into a string
    std::string msg = ss.str();
    //Creating the character the string will go in; be sure it is large enough so you don't overflow the array
    cont char * cstr[80];
    //Copies the string into the char array. Thus allowing it to be used elsewhere.
    strcpy(cstr, msg.c_str());

    return * cstr;
}

它将两个字符串连接并转换在一起以返回一个 const char *。那是因为我想使用它的函数需要传递一个 const char 指针。

4

2 回答 2

3

该代码返回一个指向本地(堆栈)变量的指针。当调用者获得此指针时,该局部变量不再存在。这通常称为悬空引用。

如果要转换std::string为 c 样式的字符串,请使用std::string::c_str().

因此,要连接两个字符串并获得一个 c 风格的字符串,请执行以下操作:

std::string input1 = ...;
std::string input2 = ...;

// concatenate
std::string s = input1 + input2;

// get a c-style string
char const* cstr = s.c_str(); 
// cstr becomes invalid when s is changed or destroyed
于 2012-12-19T14:51:56.760 回答
1

在不知道错误是什么的情况下,很难说,但是这一行:

const char* cstr[80];

似乎错了:它创建了一个包含 80 个指针的数组;当它隐式转换为指针时,类型将为char const**,当它作为参数传递给 时应该会出错strcpy,并且return语句中的取消引用与您编写的相同cstr[0],并返回数组中的第一个指针——由于数组的内容从未被初始化,这是未定义的行为。

在你继续之前,你必须定义函数应该返回什么——不仅是它的类型,还有指向的内存将驻留的位置。对此有三种可能的解决方案:

对缓冲区使用本地静态:
这种解决方案在早期的 C 中经常使用,并且仍然存在于 C 库中的许多函数中。它有两个主要缺陷:1)连续调用会覆盖结果,因此客户端代码必须在再次调用该函数之前制作自己的副本,以及 2)它不是线程安全的。(第二个问题可以通过使用线程本地存储来避免。)在像你这样的情况下,它还存在缓冲区必须足够大以容纳数据的问题,这可能需要动态分配,这增加了复杂性。
返回指向动态分配内存的指针:
这在理论上很有效,但需要客户端代码来释放内存。这必须严格记录,并且极易出错。
要求客户端代码提供缓冲区:
这可能是现代代码中最好的解决方案,但这确实意味着您需要额外的地址参数和缓冲区长度。

除此之外:std::ostringstream 如果您所做的只是连接,则无需使用;只需添加两个字符串。无论您使用什么解决方案,都要验证结果是否合适。

于 2012-12-19T17:04:38.520 回答