2013-07-18 124 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)。