c++におけるcin.clear()とcin.sync()の使用法
2022-02-25 05:08:56
最近、あるプログラムを見ていたら、cinを使った後、cin.clear(); cin.sync()を使う必要がある場合があることがわかりました。
例えば、一連の整数を読み込んでvectorオブジェクトに入れ、count()で与えられた値の出現回数を数える場合、私が最初に作ったプログラムは次のようになります。
#include
#include"algorithm"
#include
using namespace std;
int main()
{
int num;
vector<int> ivec;
while(cin>>num)
{
ivec.push_back(num);
}
cout<<"please input the number you want to count"<<<endl;
cin>>num;
cout<<num<<" appears "<<count(ivec.begin(), ivec.end(), num)<<" times"<<<endl;
return 0;
}
2が発生する回数を数えるために、1 2 3 2の3つの数字を入力したところ、最終的に次のような出力が得られました。
1 2 3 2
^Z
please input the number you want to count
2 appears 2 times
If you implement it yourself, you will find that when you finish entering 1 2 3 2 and press Ctrl+Z after please input the number you want to count will come out directly and then the number of times 2 appears, there is no chance to enter the number you want to count 2.
This means that the input stream of the system as well as the data exists, the program will input the last data as the number you want to count. So we can clear the input stream, so we can enter cin.clear(); cin.sync(). cin.clear() is used to change the status identifier of cin, and cin.sync() is used to clear the data stream in the buffer. If the identifier is not changed, then even if the stream is cleared, it cannot be entered. So the two should be used together.
The code after the change is as follows.
#include
#include"algorithm"
#include
using namespace std;
int main()
{
int num;
vector<int> ivec;
while(cin>>num)
{
ivec.push_back(num);
}
cin.clear();
cin.sync();
cout<<"please input the number you want to count"<<<endl;
cin>>num;
cout<<num<<" appears "<<count(ivec.begin(), ivec.end(), num)<<" times"<<<endl;
return 0;
}
If you implement it yourself, you will find that when you finish entering 1 2 3 2 and press Ctrl+Z after please input the number you want to count will come out directly and then the number of times 2 appears, there is no chance to enter the number you want to count 2.
This means that the input stream of the system as well as the data exists, the program will input the last data as the number you want to count. So we can clear the input stream, so we can enter cin.clear(); cin.sync(). cin.clear() is used to change the status identifier of cin, and cin.sync() is used to clear the data stream in the buffer. If the identifier is not changed, then even if the stream is cleared, it cannot be entered. So the two should be used together.
The code after the change is as follows.
#include
#include"algorithm"
#include
using namespace std;
int main()
{
int num;
vector<int> ivec;
while(cin>>num)
{
ivec.push_back(num);
}
cin.clear();
cin.sync();
cout<<"please input the number you want to count"<<<endl;
cin>>num;
cout<<num<<" appears "<<count(ivec.begin(), ivec.end(), num)<<" times"<<<endl;
return 0;
}
もう一度実行すると、正しく、カウントしたい数字が入力されます。小さな問題に思えるかもしれませんが、注意しないとプログラムエラーの原因になります。
関連
-
[解決済み】認識できないテンプレート宣言/定義
-
[解決済み] ペアの2番目の要素に基づいてペアのベクトルをソートするにはどうすればよいですか?
-
[解決済み] this->ポインタ変数で 'this' を定数式で使用できないエラー (C++)
-
[解決済み] Eclipse in Windows/ C++ / HelloWorld - プロセスの開始エラー。Cannot run program "C:..\Hello Worldsrc|Hello World.cpp": 起動に失敗しました。
-
[解決済み] C++ - 適切なデフォルトコンストラクタがない [重複].
-
[解決済み] QObject::connectとconnectメソッドの違いについて
-
[解決済み] ミニダンプを読むにはどうしたらよいですか?
-
[解決済み] QOpenGLWidgetで三角形をレンダリングするには?
-
[解決済み] C++でクエスチョンマーク文字('?')はどういう意味ですか?
-
[解決済み] pthread_cond_wait() と pthread_cond_signal() を理解する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】拡張イニシャライザーリストは、以下の場合のみ利用可能です。
-
[解決済み】C++ライブラリにmedian関数はありますか?
-
[解決済み] C++ スタッククラスのコピーコンストラクタを作成する
-
[解決済み] ERROR: '::main' must return 'int' [duplicate].
-
[解決済み] C++のゲッターとセッターの書き方
-
[解決済み] "QWidgetの前にQApplicationを構築しなければならない"
-
[解決済み] error C2061: 構文エラー : 識別子 'string'
-
[解決済み] 文字列をアルファベット順に並べるには?