我有一个循环遍历数组列表的日期并在变量num中存储一个int,当我循环前7天,我的程序崩溃,我希望它在第1天重新启动并更改为猴子& #39; 1' ...但在第一个循环之后它崩溃了。
我做错了什么?
C ++
//*********************************************************************************************
// function prototype
//*********************************************************************************************
void collectFood(string days[]);
int main(){
//array to hold week days
string days[7] = {"Mon", "Tue", "Wen", "Thur", "Fri", "Sat", "Sun"};
collectFood(days);
}
//*********************************************************************************************
// function to collect foods amounts
//*********************************************************************************************
void collectFood(string days[]){
int num = 0;
// for loop for each monkey
for (int monkey=0; monkey < 3; monkey++){
// for loop to take 7 days worth of food per monkey
for (int day=0; day < sizeof(days); day++){
cout << "Enter the pounds of food eaten by monkey " << monkey
<< " on " << days[day] << ": ";
cin >> num ;
}
}
}
答案 0 :(得分:1)
在您使用的上下文中,您对预期幅度的计算不正确。一个简单的C类型数组(无论其类型如何,都是您所拥有的)在作为简单参数传递时表示为指向类型的指针。
因此,这个:
void collectFood(string days[])
相当于:
void collectFood(string *days)
很明显sizeof(days)
确实是{em>指针到string
的大小。在您的平台上,我可以安全地假设您正在编译64位代码,因为该上下文中的指针将八个字节,因此您将超过阵列的实际大小一个元素。
有很多方法可以做到这一点。您可以简单地向collectFood
函数声明一个额外的参数,用于描述序列的大小。
void collectFood(string days[], size_t N)
并在您的for循环条件中使用N
,从collectFood
调用此main()
:
collectFood(days, sizeof(days)/sizeof(*days));
另一种方法是采用从数组推导出的非类型参数的模板,该参数由引用传递:
template<size_t N>
void collectFood(string (&days)[N])
{
...
}
再次使用for-condition中的N
作为计数限制。在这种情况下,来自main()
的来电将保持原样。电话会推断N
。作为额外的好处,您不能意外地将原始指针传递给此函数;它必须是一个声明的数组类型,或者无法推断出幅度,编译器会发出错误告诉你。
还有其他方法,但前者只是简单地传递长度并将其声明为正式参数,这可能是您最容易理解的。
祝你好运。
答案 1 :(得分:1)
当你使用sizeof(天)时,我认为这是你的内循环。将数组传递给函数时,它只传递一个指向数组第一个元素的指针,而不是整个数组。
你可以通过添加一个告诉你数组大小的函数参数来解决这个问题,或者你可以切换到使用带有size()方法的std :: vector。我个人会选择std :: vector。