我正在为我的编程类开发一个多功能程序,其中一个函数需要使用一个字符串数组。
目标是在数组中存储10个名称,然后让用户输入一个随机确定“获胜”名称的数字。
唯一的问题是,一旦我执行了我的代码,程序在完成10个循环后崩溃以获取名称。这是我试图识别的主要因素,导致崩溃的原因。
整个程序要大得多,但相关代码如下所示。
string Name1, Name2, Name3, Name4, Name5, Name6, Name7, Name8, Name9, Name10, tempName, winName;
string array[10] = {Name1, Name2, Name3, Name4, Name5, Name6, Name7, Name8, Name9, Name10};
int tempNum = 0;
int winNum;
int userEntry;
int userSelection;
for (int test = 0; test < 11; test++)
{
cout << "Enter a name: ";
cin >> tempName;
array[tempNum] = tempName;
tempNum++;
}
//The program crashes at this exact spot, right after collecting the 10th name
cout << endl;
cout << "Now choose a random number between 1 and 100: ";
cin >> userEntry;
winNum = static_cast<int>(userEntry * 3.14159 + 12.7 * 10) % 10;
winName = array[winNum];
cout << endl;
cout << "The winner of the game is" << winName << "!" << endl;
答案 0 :(得分:0)
您的数组有10个元素,并且您正在访问11个元素,0到10,这会导致程序崩溃。因为您的代码访问的位置不属于您的程序。将for循环中的条件从test < 11
更改为test < 10
。
使用&#34; at
&#34; string
类的函数,如果可以的话,它会在您尝试访问超出范围的下标时抛出异常。
答案 1 :(得分:0)
在for循环中,您尝试访问array[10]
并且不存在,因为数组只有10个元素,从0到9.这就是程序崩溃的原因。
将for循环中的条件从for (int test = 0; test < 11; test++)
更改为for (int test = 0; test < 10; test++)
,它应该有效。
答案 2 :(得分:-1)
两个问题。
一,你实例化一个包含10个元素的数组,然后查找它的第11个元素。 首先,从测试中改变if条件&lt; 11测试&lt; 10。 这将解决你的崩溃。
其次,您的程序可能会因大量输入而崩溃。 初始化字符串数组时,编译器会为数组分配一定量的内存。
分配给数组的内存量由编译器决定。 编译器确定每个字符串变量的大小,并将其乘以10以获得数组所需的总大小,并相应地分配那么多内存。
虽然字符串可以动态调整大小,但数组却不能。该数组具有分配给它的固定内存量。
因此,如果在输入您通过覆盖其索引而保存到数组中的字符串期间,您可以在数组中写入比它可以容纳的字符更多的字符。
将分配的内存量取决于实现,因为字符串的默认容量取决于实现。
一个简单的解决方法是在名称字符串Name1 =&#34; ---------------------- ---&#34 ;;
这样,用户输入的大小很可能小于初始值。