为什么我不能从字符串函数返回字符串数组?

时间:2019-03-29 09:52:44

标签: c++

我想使用我的函数创建一个字符串数组,但是我的字符串函数的返回不起作用。

string input() {
    int months[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
    string array[12];

    for (int i = 0; i < 12; i++)
    {
        int j = 0;
        while (j < months[i])
        {
            array[i] = array[i] + "-";
            j++;
        }
            }
    return array[12];
}



int main() {

    string array[12];
    array[12] = input();
    return 0;
}

3 个答案:

答案 0 :(得分:4)

首先声明您的函数以返回单个 std::string对象。其次,返回array[12],它是十二元素数组的元素十三

您实际上不能从函数返回纯数组。数组会衰减到指向其第一个元素的指针,并且当函数返回时,随着数组生命周期的结束,该指针将立即失效。

有两种解决方案:将数组(作为指向第一个元素的指针)作为函数的参数传递。或返回例如std::array对象。

答案 1 :(得分:3)

array[12]位于数组的末尾,即使它在边界内,也将是一个字符串,而不是字符串的集合。

C样式数组不可分配。 std::vector<std::string>std::array<std::string, 12>是可分配的替代方案。

using MonthMarks = std::array<std::string, 12>;

MonthMarks input() {
    std::array<int, 12> months = { 31,28,31,30,31,30,31,31,30,31,30,31 };
    MonthMarks result;

    for (int i = 0; i < 12; i++)
    {
        int j = 0;
        while (j < months[i])
        {
            result[i] = result[i] + "-";
            j++;
        }
    }
    return result;
}

int main() {
    MonthMarks = input();
    return 0;
}

请注意,std::string的构造函数采用大小和填充字符,因此您的输入可以简化为

for (int i = 0; i < 12; i++)
{
    result[i] = std::string(months[i], '-');
}

答案 2 :(得分:1)

您的问题是您在执行的操作中使用了错误的语法,而其中某些语法是不可能的。不幸的是,这都不会导致编译时错误,它只会做其他事情,包括未定义的行为。

您需要这样声明函数:

std::array<std::string, 12> input() {

您不能返回数组,但是如果将其包装到std::array中,则可以。

然后在内部执行此操作

std::array<std::string, 12> array;

并将其返回为

return array;

获取并打印如下数据:

int main() {
    std::array<std::string, 12> array = input();
    for (std::string s : array) {
        std::cout << s << std::endl;
    }
    return 0;
}