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

c++ for loop not working properly

本文关键字:工作 常工作 c++ 不能 循环      更新时间:2023-10-16

此代码仅在我取消注释时有效

//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"实例后调用terminate

what():std::bad_alloc

1钻孔(堆芯倾倒)

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

while循环中的"temp"没有任何变化。。。。在某个时刻,你会得到一个坏名字,这并不奇怪。也许

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

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

但不要担心,循环if (hasDest==false)之后的行将完全满足您的需要,因此您对其他行进行评论是完全可以的。无论如何,这是错误的。

还有一件事,你应该返回NULL作为常量,它被定义为(void*)0,而不是一个说英语单词"NULL"的字符串。否则,您可能会出现错误,因为您在函数的堆栈上分配了一个char数组并返回了一个指向它的指针,但当函数终止时,该数组将被丢弃。

temp在while循环中不变->无限循环->每次通过都会向字符串添加一个新的字符->内存耗尽

实际上,您的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的原因)。

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

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