c ++ for循环不能正常工作

时间:2013-07-18 20:27:02

标签: c++ loops

此代码仅在我取消注释时才起作用

//else return "null"; 

在第9行,但这不是我需要的。我尝试用

替换该行
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'

的实例后终止调用      

what():std :: bad_alloc

     

1Aborted(核心倾销)

5 个答案:

答案 0 :(得分:3)

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

在while循环中没有任何东西改变“temp”......在某些时候你得到bad_alloc并不奇怪。 也许

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

答案 1 :(得分:1)

当第一个字符不是“=”时,'else'语句会立即退出该函数。 你真正想要的是:'如果整个for循环没有找到'=',那么执行else语句。所以'else'应该在for循环之后。但是你把它插入里面。 所以现在你的代码说:如果第一个字符不是“=”就退出。

但是不要担心,循环if (hasDest==false)之后的行将完全按照您的需要进行操作,因此您可以完全确定其他内容。无论如何这都是错误的。

另外,你应该将NULL作为常量返回,定义为(void *)0而不是一个表示英文单词“null”的字符串。否则,您可能会收到错误,因为您在函数的堆栈上分配了一个char数组并返回指向它的指针,但是当函数终止时会丢弃此数组。

答案 2 :(得分:1)

temp在while循环中没有变化 - &gt;无限循环 - &gt;每个传递都会为字符串添加一个新字符 - &gt;记忆力耗尽

答案 3 :(得分:0)

您正在测试字符串中的第一个字符是'=',而不是您返回null。您的下一个while循环不执行任何操作,因为条件检查第一个字符是否与'='不同。此时你已经知道它不是,否则你已经返回null。所以你得到一个未初始化的字符串,导致你注意到的奇怪行为。

我假设您要复制'='之后的所有字符。然后你应该从index=1开始并测试字符串的结尾(或者是由另一个'='完成的你的sting?)?加上循环是错误的。你应该在循环中将临时变量更新为currentcommand[index] ...目前你增加了索引,但temp仍然是第一个字符....

答案 4 :(得分: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)。