我试图使用getter函数在C ++中返回一个char数组。这是学术性的,我们需要使用char [] / char *,然后返回它,以便我们可以cout
数组到控制台。
char* Groceries:: getList() const
// Returns the list member.
{
return list;
}
我也尝试在该功能中使用strcpy
。当我使用cout
类似于:" ám♥
&#34;时,这两种方法都返回了一个似乎是内存位置的内容。如果我尝试执行:cout << glistone.getList()[0];
它只会返回上一行中的第一个字符:&#34; ám♥
&#34;。
我已经阅读了许多关于C字符串等的SO问题,但是当我构建/运行我的程序而不是返回我已经返回的内容时,所有可接受的解决方案似乎都没有做任何事情。
如何在C ++中返回char *,将其打印出来,而不是返回内存地址?
答案 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被定义为数组,那么如果你不想返回指针,你可以返回对这个数组的引用而不是指针。:)