[英]Why can't I return the string array from the string function?
我想用我的函数来创建一个字符串数组,但我的字符串函数的返回不起作用。
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;
}
首先,您的函数被声明为返回单个std::string
对象。 其次,您返回array[12]
,它是十二元素数组的第十三元素。
而且您实际上无法从函数中返回普通数组。 数组衰减到指向它们的第一个元素的指针,当函数返回时,随着数组的生命周期结束,该指针将立即失效。
有几种解决方案:要么将数组(作为指向第一个元素的指针)作为参数传递给函数。 或者返回例如一个std::array
对象。
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], '-');
}
你的问题是你正在做的事情有错误的语法,有些是不可能的。 不幸的是,这两者都不会导致编译时错误,它只会执行其他操作,包括未定义的行为。
您需要像这样声明函数:
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.