我正在执行表达式求值程序,其中用户可以输入带有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 );
}
}
}
还尝试使用[]访问字符串表达式的字符本身,但这对某些情况非常有限。
答案 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流相同,如cin
和cout
。