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++データ構造とアルゴリズム」を学習する際、チェーンテーブルの章に図書館プログラムがあり、入力エラー後(整数を入力する必要があるのに文字を入力する必要があるなど)デッドサイクルに陥る場合があります.次の例の世代コードを示します.
プログラムを実行し、入力
質問:どうして入力させてくれないのですか.答えはcinの使い方とクリアバッファから来ています. 分析: このとき、バッファは空の2回目の入力である23 546+リターンである.バッファに残留データがある場合、cin関数はキーボード入力を要求することなく、これらの残留データを直接読み出すからである.したがって、このときサイクルは2回実行される.1回目cinは23をaに、2回目は中間スペースをスキップし、546をaに与える.バッファが空です.また、リターン記号も入力バッファに格納されます.前の2回の入力は、いずれも合法的な入力です.3回目の入力--f+リターン、このとき最初の文字は不正入力です(必要なのはint)の場合、0がaに与えられます.今回のサイクル後、バッファは空ではなく、リターンバーが格納されます.したがって、次のサイクルでは、次の入力を待つことなく、バッファのリターンバーを入力とします.この場合も不正入力ですが、aの結果は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]は捨てられずバッファに残り続ける
(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
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