2017-08-12 24 views
-2

我已經在C++函數從比cinstdin更快使用有競爭力的編程法官讀取輸入。快速掃描標準輸入得到整數工作

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 << 3)+(n << 1)',因爲它在速度上有優勢? – dasblinkenlight

+0

它給了我零的讀取數行突破後 – Virus

回答

0

這是因爲空行意味着兩個連續的非數字(\n)字符。你的代碼只能處理一個。添加另一個消耗空白的循環,理想情況下在函數的開頭,並將最後一個非數字字符留在緩衝區中。

+0

謝謝回答不是,請詳細說明如何做到這一點,如果可能的話也給了「修正版」 – Virus