Hatena::ブログ(Diary)

2冊の本を3等分

2010-09-12

競技プログラミングの入力メモ

C++での入力受付について

AOJの10000代問題は、解き方は乗ってても基本の入出力があまりないので補足。

自分も始めたばっかりなので、変なところがあればtwitterでつっこみください。

5つのテンプレがあります。

  1. 入力の終わりまで取るパターン
  2. 入力の終わりには0が入っているパターン
  3. カンマ区切りで座標とか入力するパターン
  4. 文字列or文字入力するパターン
  5. 半角スペースを含めて1行取るパターン


入力の終わりまで取るパターン

ex.0001

int n;
while(cin>>n){
    //処理
}

これで自動的に入力が終わるとwhileを抜けてくれます。


入力の終わりは0が入ってるパターン

問題文は

x が 0 のとき入力の終わりを示し、このデータセットに対する出力を行ってはいけません。

こんな感じ。

int n;
while(cin>>n,n){
    //処理
}

カンマ演算子によって、最後のカンマ以降のみが判定対象とされるため

cinの返り値が何であっても、0が入力された場合はループを抜けます。

別に&&でもOK。


カンマ区切りで座標とか入力するパターン

諦めてscanfを使いましょう。

この例は、最後にx=0の入力が与えられる場合。

while(scanf("%d,%d",&x,&y),x){
    //処理
}

困るのが、入力の最後までをscanfで取る場合。

scanfの返り値で取得に失敗した場合は-1が返ります。なので、

while(scanf("%d,%d",&x,&y)+1){
    //処理
}

としてやれば、取得ができなくなった時点でループから抜けてくれます。

おまけ:

while(~scanf("%d,%d",&x,&y)){
    //処理
}

でも通ります。~はNOT演算子で、詳しいことはぐぐってください。


文字列or文字入力するパターン

cinは、内部実装が変態な割に結構賢いので、

string s;
while(cin>>s){
    //処理
}

とすると、スペースまでの文字列をちゃんと入れてくれます。

偉いですね。


半角スペースを含めて1行取るパターン

ex.1042

string s;
while(getline(cin,s),s!="END OF INPUT"){
    //処理
}

getlineの返り値なんて知りませんが、

さっきのカンマ演算子によって、s!="END OF INPUT"だけが条件として使われます。

とりあえず、sの中に1行まるまる入れてくれるです。すごいです。


scanfとかgetlineの返り値って何が帰ってきてるのか知らずにやってます(白目

別に判定に使われないんだから、何が帰ってくるのか調べる気も起こりますん

kyuridenamidakyuridenamida 2010/09/13 00:43 scanf()はEOFの時-1が返るので
どうしてもscanfで入力の終わりまで受け付けたい時はwhile(~scanf("%d",&n))みたいな感じで使えます!
それにしてもcinは便利

Respect2DRespect2D 2016/05/28 09:57 カンマ区切りのときに、cinを使いたい場合、次のような感じで書けなくもないです。

>||
int x, y;
char ch; //カンマ取得用
while(cin>>x>>ch>>y){
//処理
}
||<

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証