【问题标题】:how to return std::string from a function in c++如何从 C++ 中的函数返回 std::string
【发布时间】:2020-02-17 00:26:39
【问题描述】:

我正在尝试从执行某些处理的函数中返回一个字符串。

我尝试将它作为右值引用和左值引用返回。没用:(。

处理函数:

std::string processingFunction()
{
    std::string str = "";
    //processing...
    strftime(&str[0], MAX_LENGTH, DATE_FORMAT, tm_STRUCT_ADRRESS);
    return str;
}

函数的使用:

std::string temp = processingFunction();
if(temp.empty())
{
    //stuff
}

调试时(在 VS 2019 中),我可以在 Watch 中看到 temp 的值,但 temp.empty() 总是返回 1。即使我可以看到该值存在。

这是 tl;dr 的屏幕截图: m_bucket_function is the processing function

【问题讨论】:

  • 你能告诉我们完整的代码吗?
  • temp.empty() 测试字符串是否为空,值 0 表示 false,这意味着字符串不为空。但你期待它是非空的,不是吗?所以我认为这意味着它正在工作。
  • 使用if (!temp.empty())
  • 是的,因为你自己说过 - temp 不为空(“我可以看到值”)repl.it/repls/OddDarkgrayProcess
  • 您正在写入str 缓冲区,而无需先调整其大小以容纳该数据。大不,UB。

标签: c++


【解决方案1】:

您定义一个std::string 对象并将其设置为""(空字符串)。

然后,您可以使用strftime() 以 C 样式字符串的形式复制从 &str[0] 开始的某个时间的表示到内存中。

表达式&str[0](其中strstd::string)确实允许您访问由str::string 对象管理的数据的初始字节——但它不会分配内存来保存新的值,并且它不会更新std::string 对象的内部数据(包括它所代表的字符串的长度)。您对strftime() 的调用可能会破坏未分配的内存(未定义的行为)。

您需要使用strftime() 将数据复制到char 数组中,然后将该数据复制到您的str 中。然后std::string 的赋值运算符将负责更新元数据并根据需要分配内存。

【讨论】:

    【解决方案2】:

    正如您所做的那样,按值返回 std::string 没有问题。

    temp.empty() 总是返回 1

    只是表示字符串为空。

    既然您已经发布了更多代码,并且作为@SkyZip cmets,问题在于:

    strftime(&str[0], ...
    

    这会让strftime 覆盖内存,方法是将你的字符串的地址传递给它。

    【讨论】:

    • 但它不是空的,我可以看到它的内容。
    • 在函数返回后尝试打印temptemp.empty()。要么为空,要么不为空。
    • 不是空的,因为strftime里面写了!它将修改字符串的“值”,但不会修改其大小信息或其他任何内容。因此你的空字符串。
    • 不客气,但请看对方的回答。他们很好地解释了这个问题。我发布了一个可能适用于您的情况的解决方案,但也许您应该寻找一个更“c++”风格的解决方案。
    【解决方案3】:

    如果你真的必须使用 strftime,你可以这样做:

    std::string processingFunction()
    {
        char buff[MAX_LENGTH];
        strftime(buff, MAX_LENGTH, DATE_FORMAT, tm_STRUCT_ADRRESS);
        //processing...
        return std::string(buff);
    }
    



    正如@Keith 所说,您正在这里处理对象。不仅仅是普通的旧 C 数据类型。

    编辑:
    仅供参考,这里有一个类似的问题: Current date and time as string

    【讨论】:

    • return std::string(buff); 可能只是return buff;,因为无论如何返回值都会转换为std::string
    • 是的,它可能是。但据我了解,这将是调用构造函数的隐式方式,而且大多数情况下,我宁愿使用显式方式。也有转化。
    • 我讨厌挑剔(免责声明:我喜欢挑剔),但 C++ 中“对象”一词的含义与面向对象编程无关。例如,给定int foo = 42;foo 是一个对象。
    • 对不起,我的英语词汇在这方面还有待提高。你建议用什么词来表达我的观点?
    猜你喜欢
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 2021-06-30
    • 2020-12-19
    • 2014-03-05
    • 1970-01-01
    • 2018-10-03
    • 2021-02-24
    相关资源
    最近更新 更多