为什么strpbrk()的这个功能不起作用?

时间:2015-05-27 18:14:55

标签: c++ vector

当我尝试将分隔符放入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;
}

1 个答案:

答案 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     
}
//...