2017-06-04 44 views
-3

我在這裏要做的事情非常簡單。但是某種程度上,我有些失去了一些東西。我試圖用嚴格的字符串元素「預先聲明」一個數組,以便我可以在特定的時期(定期)更新數組內容。所以這裏是片段:C++使用字符串元素聲明未指定長度的數組

string ShotBox[] = {}; //"Pre-Declare" array that could contain as many elements here 

然後我在我的更新容器中有一個循環。代碼段:

for (int i = 0; i < sizeof(ShotBox) - 1; i++){ 
      std::string soa = sPath; 
      std::string so = soa + ShotBox[i]; 
      char *cstr = new char[so.length() + 1]; 
      strcpy(cstr, so.c_str()); 
      scPath = cstr; 
} 

除了事實無論我試圖「預先聲明」,我得到一個內存訪問衝突的事實,一切都很好。在這個非常確切的片段中,確切的錯誤是:對於未指定邊界的數組,空數組是無效的。

我試過使用「矢量」,但似乎無法解決它。有什麼辦法解決這個問題?請我不要圖書館。我需要直接簡短的方法或類似的東西。

+0

std :: vector 。 – bmargulies

+0

「我試過使用」矢量「,但似乎無法解決它。」 - 你需要解釋爲什麼你可以使用std :: string而不是std :: vector。 –

+0

你不能這樣做'string ShortBox [] = {}'因爲它必須推導出ShortBox的大小,但這會導致它被推斷爲'string [0]'這是不允許的。如果您想這樣做,請指定您希望數組的大小。 – vu1p3n0x

回答

0
  1. 內存訪問衝突本身的問題是由於您誤解了sizeof操作符造成的。具體而言,sizeof(ShotBox)是陣列的大小(以字節爲單位),而不是ShotBox[]陣列大小。

    for (int i = 0; i < sizeof(ShotBox)/sizeof(std::string); i++) { 
        ... 
    } 
    
  2. forShotBox[]元素中不被更新的。發生的唯一情況是將sPathShotBox[i]串接成一個新的C字符串'cstr'。如果你的目標是更新ShotBox[i]元素,只需添加以下分配for循環的結尾:

    for (int i = 0; i < N_SHOT_BOX; i++) { 
        ... 
        ShotBox[i] = so; 
    } 
    
  3. 它更方便使用std::vector與可變大小的集合工作:

    #include <string> 
    #include <vector> 
    #include <memory.h> 
    
    int main() { 
        std::vector<std::string> ShotBox{"str1", "str2", "str3"}; 
    
        for (int i = 0; i < ShotBox.size(); i++){ 
         std::string soa = sPath; 
         std::string so = soa + ShotBox[i]; 
         char *cstr = new char[so.length() + 1]; 
         strcpy(cstr, so.c_str()); 
         ShotBox[i] = cstr; 
        } 
    
        return 0; 
    } 
    
+0

謝謝你指出所有這些。欣賞! – cmdLucas

1

使用std::vector<std::string>

vector管理一個內部數組。

std::vector<std::string> ShotBox; // (empty) 

ShotBox.push_back(a_string); // add a string to the internal array 

std::cout << ShotBox[0] << '\n'; // print first element 
+0

當我註釋Loop時,我沒有得到任何錯誤。否則,我有一個「矢量下標超出範圍錯誤」。我試圖通過在循環之前檢查if(sizeof(ShotBox)> 0)來控制它。同樣的錯誤。 – cmdLucas

+2

@cmdLucas你需要找到一本書或教程,教你如何使用'std :: vector'。 – Galik

+1

我會第二次來自@Galik的建議。我發現一本真正有用的書是Scott Meyers的[Effective Modern C++](http://shop.oreilly.com/product/0636920033707.do)。 –

0

Galik的回答暗示的std ::向量是做你想要做什麼Modern C++方式。

的原因,你的代碼不起作用的是,下面的代碼行不會做你認爲它

串ShotBox [] = {}; // 「預申報」 數組可能包含這裏的許多元素

嘗試添加以下到您的程序......

的std ::法院< <的sizeof(ShotBox)< < STD :: ENDL;

...你應該發現你聲明瞭一個零字節長的數組。事實上,如果未指定數組邊界,某些編譯器會將空初始化器視爲錯誤。

在C++語言中,數組是固定長度的實體。一種近似動態數組的方法是使用指針並使用內存管理函數分配更大的數組,然後將舊數組內容複製到新的更大數組中。

但這是一個非常糟糕的主意。

正確地做到這一點與異常安全和效率很難做到,如果你確實管理它,你會重新實現std :: vector這似乎是浪費精力!