【发布时间】:2014-06-26 11:11:42
【问题描述】:
我有一个函数我想在其他函数中使用,它从字符串中获取数字。
在基本函数中,我创建了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;
}
为了澄清,我想要这样的函数,并在上面使用它:
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 ) );
}
【问题讨论】:
-
发布您的代码,以便我们准确了解您在做什么
-
我们不知道
evaluate在做什么。因此,您需要提供所有代码,或者删除对我们不知道的函数的调用并重新创建问题。 -
valueStack.push( strtod( temp.c_str(), x ) );正在访问一个未初始化的变量x。这可能会使您的程序崩溃,因为strtod函数也会取消引用x。阅读strtod的文档,了解如何正确使用。 -
@Matt McNabb 谢谢!它导致了一个问题:)
-
@Pershing 很好;你仍然必须检查你没有点击
end()每次你在迭代器上做++。
标签: c++ string pointers iterator