如何在不通过这个角色的情况下向人物窥视?

时间:2013-12-03 00:08:07

标签: c++

我正在执行表达式求值程序,其中用户可以输入带有0b前缀的二进制数。我希望能够(使用字符串迭代器),向前查看0之后的表达式中的下一个字符是否为ab,如果是,则不传递该b字符并将字符返回给前缀开头为0(类似于ungetc)。有没有办法取消一个已经在字符串中传递的字符?

我尝试了什么:

Token::pointer_type Tokenizer::_get_number( Tokenizer::string_type::const_iterator& currentChar, Tokenizer::string_type const& expression ) 
{

assert( isdigit( *currentChar ) && "currentChar must pointer to a digit" );
Integer::value_type const MAX_UNSIGNED_D10 = (std::numeric_limits<Integer::value_type>::max()-10)/10;
Integer::value_type accumulator = *currentChar++ - '0'; 

//Binary Numbers
if( *currentChar == '0' )
{
    if( *currentChar++ == 'b'  )
    {
        BinaryInteger::value_type binAccum = _get_binary( currentChar, expression );
        return make<BinaryInteger>( binAccum );
    }
}
}



Token::pointer_type Tokenizer::_get_number( Tokenizer::string_type::const_iterator& currentChar, Tokenizer::string_type const& expression ) 
{

assert( isdigit( *currentChar ) && "currentChar must pointer to a digit" );
Integer::value_type const MAX_UNSIGNED_D10 = (std::numeric_limits<Integer::value_type>::max()-10)/10;
Integer::value_type accumulator = *currentChar++ - '0';

std::stringstream iss( expression );


//Binary Numbers
if( iss.get() == '0' )
{
    if( iss.get() == 'b'  )
    {
        BinaryInteger::value_type binAccum = _get_binary( currentChar, expression );
        return make<BinaryInteger>( binAccum );
    }
}
}

还尝试使用[]访问字符串表达式的字符本身,但这对某些情况非常有限。

2 个答案:

答案 0 :(得分:1)

当您在迭代器上调用++运算符时,它会将迭代器推进到下一个元素。要在不推进迭代器的情况下查看下一个元素,可以使用+1代替,例如:

if( *currentChar == '0' )
{
    if( *(currentChar+1) == 'b'  )
    {
        BinaryInteger::value_type binAccum = _get_binary( currentChar+2, expression );
        return make<BinaryInteger>( binAccum );
    }
}

在你偷看之前,如果currentChar已经在字符串的末尾,请小心。当前一个后面的下一个元素将是字符串的end位置,您不应该取消引用迭代器值。您可能需要考虑向tokenizer添加一个额外的参数,以便它可以检测到它何时到达输入字符串的末尾并且不会迭代太多。

答案 1 :(得分:0)

我相信stringstream peek就是你所需要的(它继承自istream,就像unget一样。字符串是与string一起工作的流。他们工作与文件流和默认I / O流相同,如cincout