簡單地說,c++14 的標準規範已經刪除了這個函式。
所以只要編譯器是按照 c++14 的標準編譯的,這個函式就是不存在的。
刪除的原因是它函式設計上的安全缺陷。
c++的高版本會逐漸普及,很多 oj 都可能會有預設 14 及以上的編譯標準。
大多數目前的比賽還是以 c++11 為標準的。
最好是看手冊,但如果你不是乙個硬核的語法粉絲,可能看手冊會比較吃力。下面我具一些例子,只針對演算法競賽實用的情況。
一般我們說到 getline,是指下面兩個之一:
std::getline()
std::cin.getline()
std::getline()
只能讀給std::string
型別(函式簽名很長,這裡不給出了,可以看手冊)
但是我不推薦這樣做,因為 string 的後續處理比較慢。
std::cin.getline()
的引數列表是:getline(char_type *__s, streamsize __n)
也就是說它可以讀給字串陣列,第二個引數指定讀入緩衝的大小。
考乙個 c 語言基礎題,s[25]
這個陣列,最多可以存幾個字元?答:24 個,陣列範圍是 0-24,其中第 24 個位置是字串結束符
'\0'
,0-23 的位置儲存了 24 個有效字元。
總而言之,如果要用getline
不可避免地要面對cin
。我的建議是不要把scanf
與cin
混用。
如果你對cin
有偏見可以這樣寫:
matches a non-empty sequence of character from set of characters.簡單地說,if the first character of the set is
^
, then all characters not in the set are matched.參考文獻
[^\n]
這裡的意思是,把緩衝區內除了換行符以外的所有符號都讀下來。這個設定還有很多有趣的特性,可以自行研究。
注意緩衝中的換行符是沒有被讀入的,所以,和gets
用法類似,你要取掉換行符。
至於到底誰的效率高,這個的測過猜知道。(我沒測)
某個朋友的經驗是,getline 可能更快。
getline
的過載函式有第三個引數,是分隔符delimeter
,你可以理解為,它可以指定換行符之外的分隔符。
這樣就可以做一些比較不可思議的事情:
}/*
input:ababac$shiahia$shaishi
output:ababac shiahia shaishi
*/
這裡的每乙個s
都是按照'$'
分割的結果。
由此我可以寫出下面乙個簡單的split
函式。(偷懶的我沒有把分隔符作為引數放進去)
vector
split
(const string &raw)
return vec;
}
結果會是下面這樣的:
s :
= ababac$shiahia$shaishi
[split
(s)]:=
s := aba$shia$shais
[split
(s)]:=
c 讀入整行字符,包括中間的空格。
寫程式時,有時需要一次輸入一行字串,中間包含空格,cin s 這樣不能讀入空格,比如輸入 123 123 s 只等於 123 遇到空格就結束了。while c getchar c 0 最笨的方法是用getchar 乙個字元乙個字元的接受。而c 裡提供了更好的方法 getline string s g...
棧的應用舉例
一 目的 掌握棧的表示,實現及其針對棧的各種操作進行具體的應用。二 要求 1 建立乙個順序棧,實現括號配對,判斷乙個表示式中括號配對是否合法。2 當使用者輸入乙個合法的表示式後,能夠返回正確的結果。能夠計算的運算子包括 加 減 乘 除 括號 能夠計算的數要求在實數範圍內。對於異常表示式給出錯誤提示。...
vector的應用舉例
1 問題描述 近來寫程式的時候,用到了容器,所以對這個操作進行了一些了解和操作。2 的迭代器的相關函式。表1 vectors的迭代器相關函式 操作 效果c.begin 返回乙個隨機訪問迭代器,指向第乙個元素 c.end 返回乙個隨機訪問迭代器,指向最後元素的下乙個位置 c.rbegin 返回乙個隨機...