【问题标题】:C++: Using and returning character arrays from functions, return type or reference?C ++:从函数、返回类型或引用中使用和返回字符数组?
【发布时间】:2010-08-26 21:18:47
【问题描述】:

C++:从函数中使用和返回字符数组,返回类型还是引用? 我正在尝试在函数之外创建一个以空字符结尾的字符串,然后运行一个函数,该函数将为它分配一些数据。例如,char abc [80] 是在 main 中创建的。然后运行input(),它将用户输入返回到abc。我认为两种明显的方法是:

1。 使输入函数将输入返回给 main 中的变量,例如:

char input ()
{
    char input [80];
    getline(cin, choice);
    return input;
}

int main ()
{
    char choice [80];
    choice = input ();
    ...
}

2。 将字符数组传递给我的引用的输入函数,然后从那里将数据放入其中:

...
void input (&variable)
{
    getline(*variable, cin);
    return;
}
int main ()
{
    char choice [80];
    char* pointer;
    input (pointer);
    ...
}

但是,我无法使用这两种方法中的任何一种。那么,我做错了什么,我该如何解决?

【问题讨论】:

  • 你做错了什么?在 C++ 程序中传递 C 类型的字符串。除非您有充分的理由使用 char * 字符串并且坚持反对我们,但您的示例没有显示任何内容。
  • 你应该真正开始学习 C++(或者 C,如果这个问题真的是 C 问题而不是 C++)。
  • 我同意所有说要使用std::string 的人的观点(除非你有好的理由不这样做),但我还要指出你的第一个 input() 函数非常无聊:它声称返回单个字符,而不是字符 。但是,即使您进行了更改,代码也会失败:您正在返回一个指向 input[] 的指针,该指针分配在 * 堆栈上 并猜测函数返回时会发生什么?没错——它在堆栈上分配的任何东西都消失了。所以你返回一个指向乱码的指针。因此,如果必须使用 char*,则应将缓冲区传递给输入函数。

标签: c++ arrays pointers string


【解决方案1】:

只需使用标准字符串。使用等宽数组的疯狂已经导致我工作的公司至少花费了数十万美元的开发时间。你的问题的正确答案可能会让你感到沮丧,但它确实是,“不要那样做!!!”

【讨论】:

  • 谢谢。在查看了一些示例后,我认为您是对的, std::string 是要走的路。我就用那个。
【解决方案2】:

在第一种方法中,您试图返回一个 char 而不是指向 char 的指针。 C++ STL 提供了一个字符串类,它以更可靠的方式封装了字符数组。当然,原始字符数组更快,但正确性比性能更重要。

std::string input()
{
    return std::string("return value");
}

int main()
{
    std::string myString = input();
}

【讨论】:

  • 这并不等同于 OPs 问题。您应该将对字符串的引用传递给 input()
  • 我不认为传入非常量引用是属于高级编程的模式。
【解决方案3】:

听听诺亚,但仅供参考,你做错的是你需要传递一个指向指针 (char** variable) 的指针。

【讨论】:

  • 只有在分配一个新的 char 数组作为函数的一部分时才适用。要写入用户提供的字符串,您只需要一个指向开始和长度的指针。 (参见例如 scanf(3)。)
【解决方案4】:

在示例 1 中,变量输入(我认为您的意思是选择)在堆栈上,并且在函数结束时消失,您不能安全地在调用函数中使用该内存位置。

在示例 2 中,您传递的是单个字符指针,要获得您想要的工作,您需要传递一个指向选择数组的指针。

char ** pointer = choice;

并且您不想在输入函数中取消引用变量,getline 需要一个双字符指针。

实际上 gnu getline 需要 3 个参数,但也许你没有使用那个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-01
    • 2014-04-11
    • 1970-01-01
    • 2013-03-25
    • 2017-02-08
    • 2014-02-06
    • 2013-11-22
    • 2019-02-01
    相关资源
    最近更新 更多