将字符串迭代器传递给函数

时间:2014-05-08 20:51:30

标签: c++ string pointers iterator

我有一个我想在其他函数中使用的函数,它从字符串中获取数字。 在基本函数中,我创建std::string::iterator并且我想将它传递给获取此数字的其他函数,跳过空格,然后外部函数继续搜索字符串。

当我使用迭代器时,我会执行类似*strPtr的操作来获取值,并使用*++strPtr来获取值并移动到另一个角色。当我将指针传递给我时,我需要使用**strPtr来获取值,我不知道如何获取值并增加迭代器。 :(

我做了*++*strPtr并且它有点工作但是它在退出内部功能时崩溃了。

double calculate( char* x ){
std::string formula = x;
ValueStack valueStack;
OperatorStack operatorStack;

std::string::iterator strPtr = formula.begin();

while( *strPtr == ' ' )
{
    strPtr++;
}

if( *strPtr == '-' )
{
    std::string temp;
    temp += *strPtr;

    while( *++strPtr == ' ' );

    while( ((*strPtr <= '9' ) && (*strPtr >= '0' )) || (*strPtr == '.') )
    {
        temp += *strPtr;
        while( *++strPtr == ' ' );
    }

    char** x;
    valueStack.push( strtod( temp.c_str(), x ) );
}

while( strPtr < formula.end() )
{

    if( *strPtr == ' ' )
    {
        while( *++strPtr == ' ' );
    }

    if( operatorStack.isOper( *strPtr ) )
    {   
        if( *strPtr == ')' )
        {
            evaluate( &valueStack, &operatorStack );
            strPtr++;
        }

        else if( *strPtr == '(' )
        {
            operatorStack.push( *strPtr );

            while( *++strPtr == ' ' );

            if( *strPtr == '-' )
            {
                std::string temp;
                temp += *strPtr;

                while( *++strPtr == ' ' );

                while( ((*strPtr <= '9' ) && (*strPtr >= '0' )) || (*strPtr == '.') )
                {
                    temp += *strPtr;
                    while( *++strPtr == ' ' );
                }

                char** x;
                valueStack.push( strtod( temp.c_str(), x ) );
            }
        }

        else if( operatorStack.prior( *strPtr ) <= operatorStack.prior( operatorStack.top() ) )
        {
            evaluate( &valueStack, &operatorStack );
            operatorStack.push( *strPtr++ );
        }

        else operatorStack.push( *strPtr++ );
    }

    else
    {
        std::string temp;
        temp += *strPtr;

        while( *++strPtr == ' ' );

        while( ((*strPtr <= '9' ) && (*strPtr >= '0' )) || (*strPtr == '.') )
        {
            temp += *strPtr;
            while( *++strPtr == ' ' );
        }

        char** x;
        valueStack.push( strtod( temp.c_str(), x ) );
    }
}

evaluate( &valueStack, &operatorStack );

double ret = valueStack.pop();
if( pow(ret, 2) < 0.000000001 ) return 0;
return ret; 
}

为了澄清,我想要像这样的make函数,并在上面使用它:

void getValue( std::string::iterator strPtr, ValueStack* valueStack )
{
std::string temp;
    temp += *strPtr;

    while( *++strPtr == ' ' );

    while( ((*strPtr <= '9' ) && (*strPtr >= '0' )) || (*strPtr == '.') )
    {
        temp += *strPtr;
        while( *++strPtr == ' ' );
    }

    char** x;
    valueStack->push( strtod( temp.c_str(), x ) );
}

2 个答案:

答案 0 :(得分:0)

有一种更简单的方法可以迭代string,例如:

    string str("3+5-4   -  3 / 4");

    for (string::iterator it = str.begin(); it!=str.end();++it)
    {
        if (!(*it == ' ')) {  // Skip spaces.

           if(isdigit(*it))
           {
             // Do your thing with ValueStack.
           }
           else
           {
               // Handle operators here.
               switch(*it)
               {
                   case('-'): break;
                   case('+'): break;
                   case('/'): break;
                   case('*'): break;
               }
           }
        }
    }

另一方面,我建议你看一下Boost.Spirit。它将帮助您以更优雅的方式实现您想要做的事情(评估数学表达式)。同样在该链接中有一个“计算器”的示例,就像您想要的那样,但使​​用spirit

您的算法仅支持一位数字。并且很难在不使用某些外部库(例如Boost.Spirit)的情况下支持多位数字。)。

答案 1 :(得分:0)

我在您的代码中看到的一件事是您假设std :: string为空终止。你的大多数循环没有正确限制。例如:

while( *strPtr == ' ' )
{
    strPtr++;
}

如果整个字符串是空格怎么办?什么阻止这个循环进入未知领域?

std :: string不必以null结尾,因此无法保证此循环在到达字符串末尾时停止。您在代码中的其他位置执行相同类型的循环。

如果您要以这种方式循环,则需要写入:

while( *strPtr == ' ' && strPtr != formula.end())
    strPtr++;