整行讀入的簡單應用舉例
為什么gets會編譯不通過?
簡單地說,C++14 的標準規范已經洗掉了這個函式,
所以只要編譯器是按照 C++14 的標準編譯的,這個函式就是不存在的,
洗掉的原因是它函式設計上的安全缺陷,
C++的高版本會逐漸普及,很多 oj 都可能會有默認 14 及以上的編譯標準,
大多數目前的比賽還是以 C++11 為標準的,
getline
最好是看手冊,但如果你不是一個硬核的語法粉絲,可能看手冊會比較吃力,下面我具一些例子,只針對演算法競賽實用的情況,
一般我們說到 getline,是指下面兩個之一:
std::getline()
std::cin.getline()
std::getline()只能讀給std::string型別(函式簽名很長,這里不給出了,可以看手冊)
{
string s;
getline(cin, s);
cout << s << endl;
}
但是我不推薦這樣做,因為 string 的后續處理比較慢,
std::cin.getline()的引數串列是:getline(char_type *__s, streamsize __n)也就是說它可以讀給字串陣列,第二個引數指定讀入緩沖的大小,
考一個 C 語言基礎題,
s[25]這個陣列,最多可以存幾個字符?答:24 個,陣列范圍是 0-24,其中第 24 個位置是字串結束符
'\0',0-23 的位置存盤了 24 個有效字符,
{
char s[25];
cin.getline(s, 25);
cout << s << endl;
}
總而言之,如果要用getline不可避免地要面對cin,我的建議是不要把scanf與cin混用,
特別做法
如果你對cin有偏見可以這樣寫:
{
char s[25];
scanf("%[^\n]s",s);
getchar();
puts(s);
scanf("%[^\n]s",s);
getchar();
puts(s);
}
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,你可以理解為,它可以指定換行符之外的分隔符,
這樣就可以做一些比較不可思議的事情:
{
string s;
while (getline(cin, s, '$')) {
cout << s << " ";
}
}
/*
input:ababac$shiahia$shaishi
output:ababac shiahia shaishi
*/
這里的每一個s都是按照'$'分割的結果,
由此我可以寫出下面一個簡單的split函式,(偷懶的我沒有把分隔符作為引數放進去)
vector<string> split(const string &raw) {
vector<string> vec;
stringstream ss(raw);
static string si;
while (getline(ss, si, '$')) {
vec.emplace_back(si);
}
return vec;
}
結果會是下面這樣的:
s := ababac$shiahia$shaishi
[split(s)] := {"ababac", "shiahia", "shaishi"}
s := aba$shia$shais
[split(s)] := {"aba", "shia", "shais"}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/251701.html
標籤:其他
下一篇:華為聚合鏈路(理論+實操命令)
