2014-03-19 19 views
0

我是一個C++新手。我想生成一個隨機的字符串序列用於我的程序。它在大多數情況下都是有效的,但是偶爾會出現行爲異常並從計算機內存中丟棄一個隨機字符串。我犯了什麼愚蠢的錯誤(如果有的話)?簡單的C++程序超出了它的數組邊界和崩潰

的代碼如下:

#include <iostream> 
#include <ctime> // Needed for the true randomization 
#include <cstdlib> 
#include <string> 

using namespace std; 

int main() 
{ 
    string holder[] = {"A", "B", "C", "D", "E"}; 

    int xRan; 
    srand(time(0)); // This will ensure a really randomized number by help of time. 

    xRan=rand()%6+1; 
    xRan--; 
    cout << "Value of xRan is: " << xRan << " value is " << holder[xRan] << endl; 

    return 0; 
} 
+0

這是走出界限,你陣列的最後一個索引是4 – PaulG

+3

66%的時間它每次工作:) – NickC

回答

2

您的xRan計算爲您提供1到6之間的數字。您的數組有5個元素,它們編號爲0到4

更改xRan=rand() % 6 + 1;xRan=rand() % 5;,然後擺脫你減少xRan的下一行。這會給你一個從0到4的數字,這就是你想要的。

0

您不必在holder足夠的元素(你需要6)。變化:

string holder[] = {"A", "B", "C", "D", "E"}; 

到:

string holder[] = {"A", "B", "C", "D", "E", "F"}; 

還請注意,你有一些冗餘的位置:

xRan=rand()%6+1; // xRan = 1..6 
xRan--;   // xRan = 0..5 

你可以改變這只是:

xRan=rand()%6;  // xRan = 0..5 
+0

不,他會需要超過6我相信。嘗試7. – PaulG

+1

@PaulG:否 - 在初始化後,他將'xRan'遞減,所以它最初是1..6,然後變成0..5。 –

+0

你是對的,我沒有看到那部分。我很抱歉。 – PaulG

2
xRan=rand()%6+1; 
xRan--; 

將生成一個從0到5的隨機數。您的有效數組索引是0到4.

+2

他在下一行遞減'xRan',所以索引是0..5(儘管這仍然超出了界限)。 –

+1

@PaulR謝謝。我想,這就是我試圖回答2小時的睡眠時所得到的結果。 –

+0

當我在第一杯咖啡之前嘗試回答SO問題時,我注意到了同樣的效果! –

相關問題