我不知道这里有什么问题。问题是数组访问包含终止代码的最后一个元素。当我在i <= sizeof(arr)
循环中使用for
作为限制器时,4个元素列表可以工作,但3个元素列表会崩溃。如果我用i < sizeof(arr)
替换它,3元素列表可以工作但是4元素列表中的最后一个元素被忽略。
int arrayList(string arr[])
{
int choice;
for (unsigned int i = 1; i <= sizeof(arr); i++)
{
cout << i << ". " << arr[i-1] << endl;
}
cout << "Select a number from 1 to " << sizeof(arr)-1 << ": ";
cin >> choice;
return choice;
}
这是一个调用数组列表的函数,但在访问第四个元素时崩溃。
void titleScreen()
{
system("cls");
int choice = 0;
do {
string arr[] = { "New Game", "Continue", "Exit" };
choice = arrayList(arr);
switch (choice)
{
case 1:
newGame();
break;
case 2:
continueGame();
break;
case 3:
exitGame();
break;
default:
choice = 0;
cout << "Invalid choice." << endl;
}
} while (choice == 0);
}
这是也调用列表的段,但它可以正常工作。
do {
string arr[] = { "Attack", "Guard", "Skill", "Item" };
switch (arrayList(arr))
{
case 1:
hero_act = hero->attack(foe);
break;
case 2:
hero_act = hero->guard();
break;
case 3:
hero_act = hero->skill(foe);
break;
case 4:
hero_act = hero->item();
break;
default:
cout << "Action invalid." << endl;
break;
}
} while (hero->hp > 0 && foe->hp > 0);
答案 0 :(得分:2)
string arr[];
sizeof(arr);
不是你想要的,因为它被编译器视为
string *arr;
sizeof(arr);
这是一个编译时常量,并且总是会返回相同的值(该值取决于所使用的机器和编译器),而不管数组中实际有多少元素。
将计数作为参数传递给函数(旧C风格)是一个选项。但是,如果始终传递大小在编译时已知的自动数组,则可以执行此操作
template <size_t N>
int arrayList(string (&arr)[N])
{
}