這是一個函數,用於檢查用戶輸入到我正在編譯的解釋器/解析器中的函數的名稱,並將其與函數數組進行比較,並執行相應的C++函數。只要用戶輸入正確的函數名稱,它就可以正常工作,但如果用戶輸入的名稱沒有功能,解釋程序就會以一些無法解釋的運行時錯誤結束,即使我將其編程爲打印「未定義的函數」,然後繼續解析循環:C++解析器源代碼中的不明原因錯誤
void parser::eval_cmd(std::string& exp, pro::command fset[])
{
expr = exp;
exp_ptr = (char*) expr.c_str();
bool found = false;
for (int i = 0; i < (int)sizeof(fset); i++)
{
if (fset[i].check(expr))
{
found = true;
exp_ptr = (char*)expr.c_str() + (fset[i].name.size() - 1);
if (fset[i].cmd)
fset[i].cmd(eval_args());
break;
}
}
if (!found) err::show(err::UNDEFINED);
}
我究竟做錯了什麼?
由於無法解釋的錯誤,你的意思是'err :: show(err :: UNDEFINED);'已經執行了嗎? – Shahbaz
@Shahbaz我之所以稱之爲「無法解釋的」錯誤的原因是爲了讓人們明白我不是在談論自己的錯誤。 – ApprenticeHacker
expr = exp;這行不是對原始字符串進行深層複製(std :: string實現引用計數)。比你拋棄了底層char *的代價。有很好的理由爲什麼c_str()返回一個const char *。你不應該以這種方式使用std :: string。 –