2016-09-21 22 views
-5

這就是:C++我的程序混淆了我很大的

#include <iostream>  
#include <cstdlib> // for rand() and srand() 
#include <ctime> 
using namespace 
int main() 
{ 
    //cout << "How many players?" << endl; 
    int numplayers=1; 
    //cin >> numplayers; 

    int players[numplayers]; 
    int x=0,y=0; 
    srand(time(0)); 
    x=(rand() % 6 + 1); 
    y=(rand() % 6 + 1); 
    players[1]=players[1]+x+y; 
    cout << ("Your score is" + players[1]) << endl; 
    cin >> numplayers;  
} 

好了我原來的問題是,這總是崩潰,現在它打印「@」 ???

+0

這是沒有很好地形成的C++。 –

+2

你明確地創建一個長度爲1的數組,然後嘗試訪問第二個元素... – David

+0

是的,我剛剛開始與C++ .. :) – Colonbracket

回答

3

C++數組是基於0的。

players[1]正在訪問數組範圍之外的位置。

你會想:players[0]

+0

雖然這可以解決問題,但它不是你想要的。當您嘗試訪問第一個玩家的陣列時,您想訪問玩家[0]。對於第二個球員來說,這將是球員[1]。 –

+0

你是否認真地暗示,修正是調整索引,而不是 - 停止整個1號陣列的瘋狂? – IInspectable

0

絕對崩潰的下面行:

players[1]=players[1]+x+y; 

由於players陣列的大小爲1,因此其僅具有索引0 。並且在上述行中,它嘗試訪問索引。看看Buffer Overflow和數組索引越界。

  • 嘗試定義一個恆定大小的數組。
  • 如果您需要動態數組,請使用鏈接列表或向量。
+1

使用額外的空間來避免訪問溢出不是最好的建議,你應該能夠創建一個所需的大小的數組,並通過索引從0到arraySize正確使用它 - 1 –

+0

對不起,我在我的帖子中給出的代碼已過時,現在已經更新。我已經將其改爲玩家[0],但感謝您的幫助。但是現在它只是打印出「@」而不是消息? – Colonbracket

+2

*「導致程序訪問溢出的原因」。* - 不是,這是未定義的行爲。你不能對一個沒有定義的結構產生明確的答案。 *「在數組大小的情況下總是採取一些額外的索引,以避免訪問溢出。」* - 坦率地說,**是**對此建議答案進行投票的原因。你不可能認真對待這件事。 – IInspectable

0
cout << ("Your score is" + players[1]) << endl; 

在這裏,您正在嘗試使用直接字符串連接,但你不能將字符串字面量這樣一個整數。你最終做指針算術,這絕對不是你想要的。

您應該改用cout的內置格式:

cout << "Your score is" << players[1] << endl; 

你的下一個問題是,players未正確申報;一個數組不能有運行時間界限,numplayers(儘管只有一個初始值)最終是一個「運行時間」變量。如果數組的大小將在以後更改,那麼最好使用std::vector;否則使numplayers a constexpr

最後一個問題是,如果數組聲明有效,那麼您將試圖訪問一個元素數組的第二個元素!第一個元素是players[0],而不是players[1]

+0

我很確定數組是正確聲明的,它不能是沒有const大小的成員,如果大小對於堆棧來說太大,它可能會失敗。可能不是一個好習慣,同意,但我不確定在這個或原始的背​​景下有什麼不正確的。 –

+1

@TimBeaudet:這絕對不正確。數組不能有運行時限。 –

+0

@TimBeaudet:而且不是會員:) –

0

有很多事情你做的不好。

  • 我相信你使用的是C++,目前還不知道如何創建動態大小的數組,例如int players[numplayers]。在C++中,我們可以創建一個固定大小的數組,例如int players[10]或使用指針到一個用於動態分配的存儲器的數組。 int* players = new int[numplayers]。這將分配一個尺寸爲numplayers的數組和一個名爲玩家指向它的int指針。我們可以使用這個指針作爲正常的數組打印陣列的第一個索引被寫爲player[0]或另一個語法是*(player + 0)。請記住在程序結束時刪除這個動態分配的內存,即delete[] player
  • 第二件事情是當你分配一個數組並且正在使用它的值進行計算時,總是將它初始化爲0,因爲新分配的數組包含垃圾值,它會影響你的計算。它初始化爲零可能是這樣的代碼:

這裏是循環:

for(int i = 0 ; i < numplayers ; i++){ 
    player[i]=0; 
    //another syntax is : *(player + i) = 0; 
} 
  • C++如您在std::cout聲明沒有不Concat的。像這樣: cout << "Your score is" << players[0] << endl;
  • 在C++中,數組總是以索引0開始,因此在這種情況下第一個索引將爲0。所以,你的程序將工作做好,如果它是這樣的:

    int numplayers = 1; 
    int* players = new int[numplayers]; 
    int x = 0, y = 0; 
    srand(time(0)); 
    x = (rand() % 6 + 1); 
    y = (rand() % 6 + 1); 
    players[0] = 0; 
    players[0] = players[0] + x + y; 
    cout << "Your score is" << players[0] << endl; 
    delete[] players; 
    
    return 0;