加载丑陋的输入

Loading ugly input

本文关键字:输入 加载      更新时间:2023-10-16

我需要知道如何在 c++ 中加载这样的输入

{ [1, 1], [2, 10] , [-10, 20] }

在C中,我可以写这样的东西:

if ( ( scanf(" %c",&bracket) ) != 1 || bracket != '{') {
    printf("Wrong input.n");
    return 1;
} // 1st bracket

while(1) {
   if ( ( scanf(" %c%d%c%d%c",&bracket1,&arr[index][0],&dot,&arr[index][1],&bracket2) ) != 5  || bracket1 != '[' || bracket2 != ']' || dot != ',') {
       printf("Wrong input.n");
       return 1;
   }
   if ( ( scanf(" %c",&tester) ) != 1 || ( tester != ',' && tester != '}' ) ) {
       printf("Wrong input.n");
       return 1;
   }
   index++;
   if ( tester == '}' ) 
      break;
  } 

但是我不知道如何在c ++中加载它并修复所有错误的输入。我尝试用 cin 加载它,但它不起作用,也无法用 cin 修复错误的输入。

您必须中断标记(或词素)中的输入。您的输入由 7 种类型的令牌组成:[ ] { } , number end_of_file .

一个可能的解决方案:

// tokens definition
enum token
{
  open_obj,
  close_obj,
  open_pair,
  close_pair,
  comma,
  number,
  end
};
// scanner
class scanner_type
{
  std::istream& mis;
public:
  token mt;
  int mn;
  scanner_type( std::istream& ais ) : mis( ais ) {}
  token get()
  {
    std::ws( mis ); // eat white
    char c;
    if ( ! mis.get( c ) )
      return mt = token::end;
    switch ( c )
    {
    case '[': return mt = token::open_pair;
    case ']': return mt = token::close_pair;
    case '{': return mt = token::open_obj;
    case '}': return mt = token::close_obj;
    case ',': return mt = token::comma;
    default:
      if ( std::isdigit( c ) || c == '-' || c == '+' )
      {
        mis.unget();
        mis >> mn;
        return mt = token::number;
      }
      else
      {
        throw "unexpected character";
      }
    };
  }
};
int main()
{
  std::stringstream ss( "{ [1, 1], [2, 10] , [-10, 20] }" );
  scanner_type sc( ss );
  assert( sc.get() == token::open_obj );
  assert( sc.get() == token::open_pair );
  assert( sc.get() == token::number );
  assert( sc.mn == 1 );
  // ...
  return 0;
}

在此处阅读有关扫描仪的信息。