当我尝试将分隔符放入vector ::运算符时,为什么程序崩溃?我正在尝试创建一个有效的计算器,我需要按顺序查找输入字符串的所有运算符。包含了所有必需的库,当我只使用2个数字和1个运算符时代码工作。我使用循环错误的问题是什么?我也有类似的功能来查找在相同位置工作和崩溃的数字。
vector<char>operators;
int main()
{
string input;
cin >> input;
find_operators(input);
}
void find_operators(string X)
{
char * cX = new char[X.length()];
strcpy(cX, X.c_str());
char * delimiter = strpbrk(cX,"+*-/");
operators.push_back(*delimiter); //this worked
while (delimiter != NULL)
{
delimiter = strpbrk(delimiter+1, "+-*/");
cout << "OK"; //makes it to this point then crashes
operators.push_back(*delimiter); //this doesn't work
}
delete[] cX;
}
答案 0 :(得分:1)
您的代码存在一些问题。第一:
char * cX = new char[X.length()];
strcpy(cX, X.c_str());
不正确,因为您没有考虑cX
中所需的空终止符。 length()
仅返回字符串中的字符数,不计算空终止符。要解决这个问题,你需要做的就是:
char * cX = new char[X.length() + 1];
strcpy(cX, X.c_str()); // ^^^^ add one to the size
你遇到的第二个问题是:
while (delimiter != NULL)
{
delimiter = strpbrk(delimiter+1, "+-*/");
cout << "OK"; //makes it to this point then crashes
operators.push_back(*delimiter); //this doesn't work
}
您检查delimiter
是否为空,然后使用strpbrk()
重新分配。如果strpbrk()
返回NULL
,则operators.push_back(*delimiter)
将失败,因为您正在取消引用空指针。您应该能够将代码更改为以下代码以使其工作:
//...
char * delimiter = strpbrk(cX,"+*-/"); // get operator
while (delimiter != NULL) // keep looping while we have an operator
{
operators.push_back(*delimiter); // add the operator to the vector
delimiter = strpbrk(delimiter+1, "+-*/"); // find the next operator
}
//...