我有一个我想在其他函数中使用的函数,它从字符串中获取数字。
在基本函数中,我创建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 ) );
}
答案 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++;