整行讀入的簡單應用舉例

2021-10-17 08:46:31 字數 2012 閱讀 5348

簡單地說,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。我的建議是不要把scanfcin混用。

如果你對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 返回乙個隨機...