2013-10-17 203 views
0

當我嘗試運行此代碼時,它崩潰。沒有錯誤消息。當程序編譯和運行,它只是顯示了Windows 7的消息,「這一計劃已停止工作。」:動態分配的字符串數組

void readGameFile(string ** entries, int * num_entries, string ** story, int * num_lines) 
{ 
    ifstream madlib("madlibs1.txt"); 
    string line; 
    getline(madlib, line); 
    *num_entries=stoi(line); 
    *entries=new string [*num_entries]; 
    for (int i=0; i<*num_entries; i++) 
    { 
     getline(madlib,*entries[i]); 
    } 

我做了一些測試,它似乎分配entries[0]的值,然後崩潰時試圖分配entries[1]的值。我被迫使用這個函數名稱,特別是那些函數參數和參數類型。我也可能不會使用malloc,vector或其他我見過的答案。

+0

您可以檢查使用['IS_OPEN ()'](http://en.cppreference.com/w/cpp/io/basic_ifstream/is_open)如果文件已經打開? –

+0

我用各種方式檢查了文件打開。它能夠從文件中讀取事物。這似乎與我動態分配的方式有關。現在它給了我一個調試錯誤,並說「中止已被調用。」 – user2889285

+0

'for(int i = 0; i <* num_entries; i ++)''num_entries'是一個指針。我想你打算在循環條件中使用'* num_entries' –

回答

1

我認爲這個問題是優先的一個:你幾乎可以肯定 想:

getline(madlib, (*entries)[i])); 

否則,你從string**索引,然後 提領:*(entries[i])

你還需要檢查的getline的結果,可能在 循環:

for (int i = 0; madlib && i != *num_entries; ++ i)... 

還有std::stoi之前。

最後:我不知道你爲什麼被迫使用這個 函數簽名。這是可怕的C++,你永遠不應該寫這樣的東西 。從邏輯上講,std::vector<string> 將是一個更好的解決方案,但即使沒有它:您的功能 有4個輸出參數。這可以通過返回 a struct來得到更好的處理。如果失敗了,C++中的輸出參數是 通常是由非const引用實現,而不是由指針實現。 雖然在某些情況下有使用指針的參數,但是當它產生指向指針的指針時,它是邪惡的。如果 沒有別的:

bool  // Because we have to indicate whether it succeed or failed 
readGameFile(std::string* &entries, int &num_entries, std::string* &story, int &num_lines) 
// ... 

(其實,這看起來更像是它應該是構造函數, 然而,一類具有兩個數據元素,entriesstory。)

+0

+1我也注意到瞭解引用優先級,但是對於我的生活而言,無法想出一個在我腦海中有意義的表示。我非常喜歡你的兩個例子。 – WhozCraig

+0

現在全部修好了。我很感激。非常感謝你。要回答你的問題,這是大學作業的一部分。因此,愚蠢的限制... – user2889285

+0

@ user2889285如果這是一項任務,我對誰給了它的人的能力有懷疑。 –