Cpp知識記録と総括

9627 ワード

文書ディレクトリ
  • 1、cin
  • 1.1、cinがデッドサイクルになる
  • 1.2 cinで入力
  • 1.2.1 cin
  • 1.2.2 cin.get
  • 3.cin.getline()基本用法



  • 1、cin
    1.1、cinがデッドサイクルになる
    デッドサイクルcase 1:「C++データ構造とアルゴリズム」を学習する際、チェーンテーブルの章に図書館プログラムがあり、入力エラー後(整数を入力する必要があるのに文字を入力する必要があるなど)デッドサイクルに陥る場合があります.次の例の世代コードを示します.
    #include 
    using namespace std;
    
    int main(){
         
        int a = 0;
        while(true){
         
            cin >> a;
            cout << "~" << a << '~' << endl;
        }
        
        return 0;
    }
    

    プログラムを実行し、入力
    1
    ~1~
    23 546
    ~23~
    ~546~
    f
    0
    0
    0
    ...0
    

    質問:どうして入力させてくれないのですか.答えはcinの使い方とクリアバッファから来ています.  分析: このとき、バッファは空の2回目の入力である23 546+リターンである.バッファに残留データがある場合、cin関数はキーボード入力を要求することなく、これらの残留データを直接読み出すからである.したがって、このときサイクルは2回実行される.1回目cinは23をaに、2回目は中間スペースをスキップし、546をaに与える.バッファが空です.また、リターン記号も入力バッファに格納されます.前の2回の入力は、いずれも合法的な入力です.3回目の入力--f+リターン、このとき最初の文字は不正入力です(必要なのはint)の場合、0がaに与えられます.今回のサイクル後、バッファは空ではなく、リターンバーが格納されます.したがって、次のサイクルでは、次の入力を待つことなく、バッファのリターンバーを入力とします.この場合も不正入力ですが、aの結果は0であり、そのままループしていきます. 
    #include 
    using namespace std;
    
    int main(){
         
        int a = 0;
        while(true){
         
            cin >> a;
            cout << "~" << a << '~' << endl;
            if(!cin.good()){
          //cin.good()    ,     ,   0
                cout << "wrong input!" << endl; //       ,        
                cin.clear(); //  cin    
                cin.ignore(); //     --cin.sync() linux      ,  linux       
            }
        }
        
        return 0;
    }
    

    1.2 cinで入力
    参考:C++入力cin,cin.get(),cin.getline()詳細比較および例以下は簡単に説明しますが、詳細例は参照リンクを参照できます.
    1.2.1 cin
      終了条件:[enter],[space],[tab],[tab] 処理方法:cinがバッファ内の[enter],[space],[tab]に遭遇すると現在の入力が終了し、[enter],[space],[tab]が破棄され,次の入力が継続され,連続[space],[enter,[tab]がすべて破棄される.
    1.2.2 cin.get
    (1)一パラメータ
    使用法:a=cin.get()またはcin.get(a)
    終了条件:文字を入力してから戻る
    説明:これは1文字の入力で、用途は1つの文字を入力するので、そのASCALLコードをaの中に預け入れます
    処理方法:cinとは異なりcin.get()バッファで[enter],[space],[tab]は捨てられずバッファに残り続ける
    #include 
    using namespace std;
    main ()
    {
         
    char ch;
    ch=cin.get();               //  cin.get(ch);
    cout<<ch<<endl;
    }
    

    (2)二パラメータ
    使用法:cin.get(arrayname,size)はarraynameに文字を入力し、長さはsize注釈を超えない:arraynameはchar[]タイプ、すなわちchar配列タイプであり、stringタイプではない.sizeとは、入力長さ、すなわち入力を許可する最大長さを指す.
    一般的にsize'は入力のサイズを制限し、受け入れ文字列の長さはsizeサイズまで拡張できます.
    処理方法:char a[arraylength]にデータを入力し,配列長はarraylengthとする.cin.get(a,size)—size,arraylengthの違いは4種類に分けることができます:クラス1:列長arraylengthを入力すると、arraynameサイズが自動的に拡張され、すべてのデータを保存できます
    例1:char a[10];cin,get(a,20);
    入力:123456789012[enter]
    出力a配列:123456789012では、12文字をa[10]に入力すると、システムは自動的にa[10]を拡張し、このとき実数組長は13(‘123456789012’0’)であることがわかる.しかしsizeof(a)を計算すると、現実的には10である
    クラス2:入力列長
    例2:char a[10];cin.get(a,20);
    入力:12345[enter]
    出力:12345、このとき配列内のデータは‘12345’0’’である
    クラス3:シリアル長>sizeを入力し、size文字を切り取り、arraylengthより大きい場合は、前arraylength-1文字を入力し、最後に'0'を追加します.
    例3:char a[5];cin,get(a,10);
    入力:123456789012[enter]
    出力:123456789まず9文字を切り取って‘123456789’/0’/0’になり、それからaに入れて、aは自動的に長さを拡張します
    クラス4:入力列長>size、先にsize文字を切り取り、arraylengthより小さい場合は配列に切り取り列を入れ、最後に'0'を補充する
    例4:char a[15]、cin.get(a,10)
    入力:123456789012[enter]
    出力:123456789このとき配列内は「123456789'0'」注意:前size-1が有効で、最後の補完'0'
    以上、配列長より大きい文字列放出char a[arraylength]では、システムが配列aの長さを自動的に拡張してaを下に置くことができるが、これにより運転エラー(3)の3パラメータが発生しやすい
    使用法:cin.get(arrayname,size,s)はarrayname文字配列にデータを入力し、長さsizeに達したときに終了または文字sに遭遇したときに終了する
    注記:aは文字配列、すなわちchar a[]lタイプであり、stringタイプではない.sizeは最大の入力長です.sは制御であり,sに遭遇すると現在入力終了キャッシュ領域のsは破棄される.
    3.cin.getline()基本用法
    cin.getline()の使い方とcin.get()の用法はほぼ同じで、1つのパラメータの用法がなくて、2パラメータだけあって、3パラメータの2種類cin.gerline(arrayname,size) cin.getline(arrayname,size,s)の使い方とcin.get()の効果はほぼ同じですが、(1)cin.getline(arrayname,size)とcinの違いもあります.get(arrayname,size)の違い
    cin.get(arrayname,size)は[enter]に遭遇すると現在の入力を終了し、バッファの[enter]を削除しません.
    cin.getline(arrayname,size)は[enter]に遭遇すると現在の入力を終了するが、バッファ内の[enter](2)cin.getline(arrayname,size,s)とcinは削除する.Gei(arrayname,size,s)の違い
    cin.getline(arrayname,size,s)sに遭遇すると入力が終了し、sをバッファから削除します
    cin.get(arrayname,size,s)sに遭遇すると入力は終了するが、バッファ内のs————————————————————————————著作権声明:本文はCSDNブロガー「Mac Jiang」のオリジナル文章であり、CC 4.0 BY-SA著作権協定に従い、原文出典リンクと本声明を転載してください.原文リンク:https://blog.csdn.net/a1015553840/article/details/50579396