2012-05-06 10 views
0

プロジェクトでは、グラフの色付けの問題を解決する必要があります。しかし、入力には、変数を格納するために必要なデータにアクセスするために解析する方法がわからない特定の構文が必要です。フォーマットされたユーザー入力をC++で構文解析する

入力制約は、最初に色の数を入力し、次に頂点の数を入力し、続いてエッジのシーケンスを入力します。エッジは(v1 v2)の形式で入力する必要があります。シーケンスはv1 = -1で終了します。だから、(-1 0)(-1 -1)など

ので、入力はの線に沿って何かを見てしまいます。私も開始する見当がつかないよう

2 4 (0 1)(1 2)(2 3)(3 0)(-1 -1) 

すべてのヘルプは大、いただければ幸いです!私はここに同様の質問があることを知っていますが、この特定の実装にソリューションを適用する方法を理解することはできません。

+1

これが宿題の場合は、宿題を追加するか、投稿に少なくともそのように記載する必要があります。 – jedwards

+0

そしてなぜこの*構文的砂糖*にタグをつけましたか? – jedwards

+1

@jedwardsタグを編集しました。私が知る限り、タグはこの質問には意味がありません。 – Corbin

答えて

2

はこのような何か試してみてください:

#include <iostream> 

static inline int error(int n) { std::cerr << "Input error!\n"; return n; } 

int main() 
{ 
    int nc, nv; // number of colours and vertices 

    if (!(std::cin >> nc >> nv)) { return error(1); } 

    for (int i = 0; i != nv; ++i) 
    { 
     char lb, rb; 
     int v1, v2; 
     if (!(std::cin >> lb >> v1 >> v2 >> rb) || lb != '(' || rb != ')') { return error(1); } 

     std::cout << "We have a pair [" << v1 << ", " << v2 << "]\n"; 
    } 
} 

を入力処理の重要な原則に注意してください。すべての入力操作が条件のコンテキスト内で表示されます。 @jedwardsによると、入力はstd::istream(文字列ストリームやファイルストリームなど)でもよいし、私の例のようにstd::cinでもかまいません。

+0

'std :: cin'を[' std :: stringstream'](http://www.cplusplus.com/reference/iostream/stringstream/)または['std :: ifstream'](http://www.cplusplus.com/reference/iostream/ifstream/ )あなたは毎回同じ入力をタイプする必要がない場合に備えて、 – jedwards

0

standard input/outputを調べるとよいでしょう。基本的には、ユーザーが入力を入力し、それをstd::string mystr; std::getline(con, mystr);のようにしてから、>>演算子とstd::stringstreamを使用して解析します。空白やカッコをスキップすることができます。したがって、最初の2つの数値を取得するには、次のようにします。int colors, verts; char c; stringstream(mystr) >> colors >> c >> verts;残りの入力に対してこれを展開することができます。

関連する問題