#41682: cin >> int 跟 getline之間的buffer


AtwoodYen (帥剛剛)


一般情況下,如果cin>>一個int接下來要getline()時,我都習慣用cin.get();把buffer中的換行讀掉

但這題在int跟接下來的string之間存在空行,所以cin.get();測資有效,但提交0分。

將cin.get();讀一字改成getline()後才AC

#53984: Re: cin >> int 跟 getline之間的buffer


pofly (不挖鼻孔有害身心健康)


一般情況下,如果cin>>一個int接下來要getline()時,我都習慣用cin.get();把buffer中的換行讀掉

但這題在int跟接下來的string之間存在空行,所以cin.get();測資有效,但提交0分。

將cin.get();讀一字改成getline()後才AC


實測後其實 int 和 接下來的 string 之間並不存在任何空行 (如果有的話應該會看到一堆python抱怨格式不對)

cin.get()cin.ignore() 無法 ac 的原因是第一行並非只有數字,在數字和換行符之間有多餘的「空格

cin.get()cin.ignore() 做的事情都是一樣的,都是「忽略一個字元」

這就是用 getline 的人無法 ac 的原因

 

解決方式也很簡單

cin.ignore() 是允許傳入參數的,不填入任何參數就和 cin.get() 的行為一樣。

語法: std::cin.ignore(  std::streamsize count = 1, int_type delim = Traits::eof() )

第一個參數意思是要忽略幾個字元,預設為 1

第二個參數意思是要什麼字元為止,預設是 eof

 

所以我們只需要設定一個足夠大的數字,告訴程式我們最多可能要忽略這麼多字元

那具體該設多大呢?

其實題目有說了,每行最多 75 個字元。

如果是以測資結果考慮,只要是大於 2 的數字應該都可以。

 

最後就是這樣寫: cin.ignore(75, '\n')

這樣就不需要額外的 buffer 了