此代码仅在我取消注释时才起作用
//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(核心倾销)
答案 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
)。