2013-07-18 149 views
-1

此代碼的工作,只有當我在9號線取消註釋C++ for循環不正常

//else return "null"; 

,但是這不是我所需要的。我試圖更換該行

else continue; 

但它也不起作用。 「currentCommand」是一個c風格的字符串。

std::string Parser::dest(){ 
//Determines whether C-command has a dest mnemonic 
bool hasDest = false; 
for (int i=0; i<strlen(currentCommand); i++){ 
    if (currentCommand[i] == '='){ 
     hasDest = true; 
     break; 
    } 
    //else return "null"; 
} 

if (hasDest == false) return "null"; 

std::string destm; 
char temp; 
int index = 0; 
temp = currentCommand[index]; 
while (temp != '='){ 
    destm += temp; 
    index++; 
} 
return destm; 
} 

我應該當我調用這個函數來得到一個輸出,並且我得到它,當我取消//else return "null" ..但它不是我所需要的輸出。但是,當我離開這行評論,我沒有得到任何輸出,並在一段時間後出現此錯誤:

終止叫做拋出「的std :: bad_alloc的」

的實例以後有什麼():STD: :bad_alloc的

1Aborted(核心轉儲)

+1

如果* currentCommand的第一個字符*不是''='',則返回「null」。可能不是你想要的。如果它*是*你想要的,那麼你肯定有一種奇怪的方式來檢查數組中的第一個元素...... –

+3

A)爲什麼你將c風格的字符串與std :: string混合使用? B)什麼「不起作用」? C)預期的行爲是什麼? – Borgleader

+0

你想用這個循環做什麼 –

回答

3
temp = currentCommand[index]; 
while (temp != '='){ 
    destm += temp; 
    index++; 
} 

沒有改變「臨時」,while循環....並不感到驚訝,你得到一個bad_alloc在某一點。 也許在while循環

while ((temp = currentCommand[index++]) != '=') { 
    destm += temp; 
} 
+0

同樣,我花了很多時間和耐心在一些如此簡單的更正-_- .....謝謝! –

1

當第一個字符不是 「=」 中的 '其他' 語句立即退出函數。 你的真正意圖是:'如果整個for循環沒有找到'=',那麼執行else語句。所以'else'應該在for循環之後。但是,你插入它。 所以現在你的代碼說:如果第一個字符不是「=」就退出。

但是不用擔心,循環後的行if (hasDest==false)將完全符合您的需求,所以您完全可以評論其他。無論如何,這是錯誤的。

另一件事,你應該返回NULL作爲定義爲(void *)0的常量而不是一個說英文單詞「null」的字符串。否則,你可能會遇到錯誤,因爲你在函數堆棧中分配了一個char數組並返回一個指向它的指針,但是這個數組在函數終止時被丟棄。

+0

'NULL'不是確定'(void *)0'。等等,你描述的問題與返回''null''是不存在的,返回一個字符串會將它複製到返回的'std :: string'中,返回'NULL'將會拋出一個異常 – chris

1

溫度並沒有改變 - >無限循環 - >每次傳球增加了一個新的字符字符串 - >內存耗盡

0

您正在測試字符串中的第一個字符是'='而不是你回報null。您的下一個while循環不會執行任何操作,因爲條件會檢查第一個字符是否與'='不同。在這一點上,你已經知道它不是,否則你將已經返回null。所以你得到一個未初始化的字符串,導致你注意到奇怪的行爲。

我假設你想複製'='之後的所有字符。那麼你應該從index=1開始測試字符串的結尾(或者是由另一個'='完成)?加上循環是錯誤的。你應該更新臨時變量爲currentcommand[index]循環內...目前你增加索引,但temp仍然是第一個字符....

0

實際上,您的for循環根本就不是問題。 (雖然它可能仍然是使用現有的功能就像strchr一個好主意。)

這是造成問題的代碼:

std::string destm; 
char temp; 
int index = 0; 
temp = currentCommand[index]; 
while (temp != '=') { 
    destm += temp; 
    index++; 
} 

您設置temp到任何字符串中的第一個字符是,但在你的while循環中,你永遠不會改變temp的值。您的destm將繼續增長,一次又一次地增加temp的初始值,直到您耗盡內存(這就是爲什麼您會收到bad_alloc)。