行全体の読み込みの簡単な応用例

8557 ワード

行全体の読み込みの簡単な応用例
なぜ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に直面することは避けられない.私の提案はscanfcinを混用しないことです.
特別なやり方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"}