行全体の読み込みの簡単な応用例
8557 ワード
行全体の読み込みの簡単な応用例
なぜ
簡単に言えば、C++14の標準仕様はこの関数を削除しました.
したがって、コンパイラがC++14の標準に従ってコンパイルされている限り、この関数は存在しません.
削除の原因は、関数設計上のセキュリティ上の欠陥です.
C++の高バージョンが普及し、多くのojにデフォルト14以上のコンパイル基準がある可能性があります.
現在の試合の多くはC++11を基準としている.
マニュアルを見たほうがいいですが、ハードコアな文法ファンでなければ、マニュアルを見るのは骨が折れるかもしれません.次に、アルゴリズムコンテストの実用的な状況についていくつかの例を示します.
一般的にgetlineといえば、次の2つの1つを指します.
しかし、stringの後続処理が遅いので、お勧めしません.
つのC言語の基礎問題を試験して、
答え:24個、配列範囲は0-24であり、24番目の位置は文字列終端子
要するに、
特別なやり方
matches a non-empty sequence of character from set of characters.
If the first character of the set is
参考文献
簡単に言えば、
注意バッファの改行文字は読み込まれていないので、
いったい誰の効率が高いのか、これは推測して知っている.(私は測っていません)
ある友達の経験では、getlineがもっと速いかもしれません.
レース操作
これにより、不思議なことをすることができます.
ここでの各
これにより、次の簡単な
結果は次のようになります.
なぜ
gets
がコンパイルに失敗したのですか?簡単に言えば、C++14の標準仕様はこの関数を削除しました.
したがって、コンパイラがC++14の標準に従ってコンパイルされている限り、この関数は存在しません.
削除の原因は、関数設計上のセキュリティ上の欠陥です.
C++の高バージョンが普及し、多くのojにデフォルト14以上のコンパイル基準がある可能性があります.
現在の試合の多くはC++11を基準としている.
getline
マニュアルを見たほうがいいですが、ハードコアな文法ファンでなければ、マニュアルを見るのは骨が折れるかもしれません.次に、アルゴリズムコンテストの実用的な状況についていくつかの例を示します.
一般的にgetlineといえば、次の2つの1つを指します.
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)
、すなわち文字列配列に読み込むことができ、2番目のパラメータは読み込みバッファのサイズを指定します.つの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("%[^
]s",s);
getchar();
puts(s);
scanf("%[^
]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. 参考文献
簡単に言えば、
[^
]
ここでは、バッファ内の改行記号以外のすべての記号を読むという意味です.この設定には興味深い特性がたくさんあり、自分で研究することができます.注意バッファの改行文字は読み込まれていないので、
gets
と同様に改行文字を外します.いったい誰の効率が高いのか、これは推測して知っている.(私は測っていません)
ある友達の経験では、getlineがもっと速いかもしれません.
レース操作
getline
のリロード関数には、3番目のパラメータがあります.セパレータ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"}