C ++如何在getter函数中返回* char / char []?

时间:2014-11-09 17:34:06

标签: c++ arrays char

我试图使用getter函数在C ++中返回一个char数组。这是学术性的,我们需要使用char [] / char *,然后返回它,以便我们可以cout数组到控制台。

char* Groceries:: getList() const
// Returns the list member.
{
    return list;
}

我也尝试在该功能中使用strcpy。当我使用cout类似于:&#34; ám♥&#34;时,这两种方法都返回了一个似乎是内存位置的内容。如果我尝试执行:cout << glistone.getList()[0];它只会返回上一行中的第一个字符:&#34; ám♥&#34;。

我已经阅读了许多关于C字符串等的SO问题,但是当我构建/运行我的程序而不是返回我已经返回的内容时,所有可接受的解决方案似乎都没有做任何事情。

如何在C ++中返回char *,将其打印出来,而不是返回内存地址?

3 个答案:

答案 0 :(得分:1)

这是一个返回C-Style字符串的函数示例以及打印它的main函数。

#include <stdio>

char * a_function(void)
{
  static const char my_test[] = "Propane explodes.\n";
  return &my_test[0]; // It's a MISRA thing.
}

int main(void)
{
  char * p_text = 0;
  p_text = a_function();
  std::cout << Here's the text: "
            << p_text;
  std::cout.flush(); // Just to be sure.
  return 0;
}

在您的功能中,我建议您使用调试器并验证list 的值。

上面的示例使用硬编码的char数组来证明这个概念。你有一个变量,我们不知道它的类型,也不知道它是如何得到它的价值的,所以必须发现它的内容。 调试器可以帮助您解决此问题。

编辑1
对于纯粹主义者,我知道该函数应返回char const *,但我想匹配OP的函数,但使用常量数据。

这是该函数的另一个版本:

char * another_function(void)
{
  static char text_buffer[64];
  strcpy(text_buffer, "Use a debugger!\n");
  return text_buffer;
}

答案 1 :(得分:0)

如果您绝对需要使用C风格的数组和指针,那么您需要使用new最好智能指针:

std::unique_ptr<char[]> getList() const {
    const char *someCString = // whatever
    char *p = new char[strlen(someCString) + 1];
    strcpy(p, someCString);
    return std::unique_ptr<char[]>(p);
}

并且在来电者中:

auto p = object.getList();
std::cout << p.get() << "\n";

如果你也不能使用智能指针,那么delete[]当调用者不再使用它时返回的指针,以便释放内存。

答案 2 :(得分:0)

该问题与函数定义没有任何共同之处,尽管其返回类型可以定义为const char *

问题是列表中存储或指向的字符串不是零终止,它似乎包含一些垃圾。

所以搜索你正在修改列表的错误。

也是你的问题

  

如何在C ++中返回char *,打印出来,而不是返回   记忆地址?

是矛盾的。如果list被定义为数组,那么如果你不想返回指针,你可以返回对这个数组的引用而不是指针。:)