2017-08-12 3 views
-2

競合プログラミングジャッジで使用するために、cinより速くstdinから入力を読み取るために、この関数をC++で作成しました。整数を取得するためにstdinを高速スキャンする

inline int VReadNumber() { 
int n = 0; 
int ch = getchar_unlocked(); 

while(ch >= '0' && ch <= '9') { 
    n = (n<<3) + (n<<1) + ch - '0'; 
    ch = getchar_unlocked(); 
} 

return n; } 

すべての入力が

2 
40 40 
80 
5 
1 2 3 4 5 
10 

のように改行なしで与えられている。しかし、それは

2 
40 40 
80 

5 
1 2 3 4 5 
10 

のように入力して改行してうまくやっていないとだけ読み込む場合、それは完璧に動作します改行までの値、ここではまで80までです。

この作業を改行するにはどうすればよいですか?また、使用例も高く評価されます。

scanfなどの代わりに、すべての「ニュアンス」でこれを使用する価値はありますか?

+0

* ...改行ではうまくいかない* ...どういう意味ですか?何がうまくいかない? – lurker

+1

今日のコンパイラでは、 'n * 10'を' n * 10' + '(n << 1)'に最適化しないと思うでしょうか? – dasblinkenlight

+0

これは、改行の後に番号を読むのではなく、ゼロを返します。 – Virus

答えて

0

これは、空白行が2つの連続した非数字(\n)文字を意味するためです。コードでは1つしか処理できません。理想的には関数の先頭にある空白を消費する別のループを追加し、最後の非数字文字をバッファに残します。

+0

お返事ありがとうございます。これを行う方法を詳しく教えてください。可能であれば、 – Virus

関連する問題