字符串数组导致c++程序崩溃

String Array Causes C++ Program to Crash

本文关键字:程序 崩溃 c++ 数组 字符串      更新时间:2023-10-16

我正在为我的编程课编写一个多功能程序,其中一个函数需要使用字符串数组。

目标是在数组中存储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;

在for循环中,您试图访问array[10],但这并不存在,因为数组只有10个元素,从0到9。这就是你的程序崩溃的原因。

将for循环中的条件从for (int test = 0; test < 11; test++)更改为for (int test = 0; test < 10; test++),它应该可以工作。

您的数组有10个元素,而您要访问11个元素,从0到10,这会导致程序崩溃。因为你的代码正在访问一个不属于你的程序的位置。将for循环中的条件从test < 11更改为test < 10。如果可以的话,使用string类的" at "函数,当您尝试访问超出范围的下标时,它会抛出异常。

有两个问题

1,你实例化了一个有10个元素的数组,然后查找它的第11个元素。首先,改变测试<11 .测试<10.这将解决你的崩溃。

其次,您的程序可能会因为大量输入而崩溃。初始化字符串数组时,编译器会为该数组分配一定的内存。

分配给array的内存量由编译器决定。编译器确定每个字符串变量的大小,并将其乘以10得到数组所需的总大小,并相应地分配该大小的内存。

字符串可以动态调整大小,而数组不能。数组有一个固定的内存分配给它。

因此,如果在输入通过覆盖索引保存到数组中的字符串时,您可以向数组中写入超过其容量的字符。

将分配的内存量取决于实现,因为字符串的默认容量取决于实现。

一个简单的解决方法是在开头将名称字符串定义为一个大字符串,如字符串Name1 = "-------------------------";

这样,用户输入的大小很可能比初始值小。