-1

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

//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' 的实例后调用终止

什么():std::bad_alloc

1中止(核心转储)

4

5 回答 5

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

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

while ((temp = currentCommand[index++]) != '=') {
    destm += temp;
}
于 2013-07-18T20:34:56.850 回答
1

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

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

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

于 2013-07-18T20:34:29.363 回答
1

temp 在 while 循环中没有变化 -> 无限循环 -> 每次传递都会向字符串添加一个新字符 -> 内存耗尽

于 2013-07-18T20:39:36.027 回答
0

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

我假设您想复制 . 之后的所有字符'='。然后你应该开始index=1并测试字符串的结尾(或者你的刺被另一个完成'=')?加上循环是错误的。您应该将 temp 变量更新到currentcommand[index]循环内...当前您增加索引但temp仍然是第一个字符...。

于 2013-07-18T20:42:49.377 回答
0

实际上,您的for循环根本不是问题。(尽管使用现有的函数(如strchr.)可能仍然是一个好主意。)

这是导致问题的代码:

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

您设置temp为字符串中的第一个字符,但在您的 while 循环中,您从未真正更改temp. 您destm将不断增长,一遍又一遍地添加初始值,temp直到内存不足(这解释了为什么您会得到 a bad_alloc)。

于 2013-07-18T20:44:18.667 回答