All of the following programs default to main Function , Omit other statements
(1) cin When reading data from the input buffer , Before the first valid character is skipped [ Space ][Tab][ Line break ] These separators .
char a; cout<<"input:"; cin>>a; cout<<"char:"<<a <<endl;
At the end of [ enter ] Represents the end of the last input , The same below , Don't prompt again
input :[ Space ][Tab][ enter ]a[ enter ]

(2) cin After the character is read successfully, the separator after the character will remain in the input buffer .
Introduce a function :istream& getline (istream& is, string& str);
Extracts characters from is and stores them into str until the newline
character, ‘\n’.
For capture [ Line break ] symbol , And save all the contents before the newline character in the str in , And will ’\n’ Delete directly from the input buffer .
char a; string test; cin>>a; getline(cin,test);// No blocking cout<<a<<endl;
cout<<"test:"<<test<<endl;
input :a[ enter ]
This is the last one [ enter ] cover getline() to intercept , The input buffer is empty , So the direct output is empty .

input :a[ Space ]test[ enter ]
find [ Space ] Also stored in test in , It's printed out .

(3) cin.get() Gets the first character of the input buffer , No separator is ignored . After successful reading, the data after the character continues to remain in the input buffer .
char a,b; string str; cout<<"input:"; a=cin.get(); cin.get(b);
getline(cin,str); cout<<"a:"<<a <<endl; cout<<"b:"<<b <<endl; cout<<"str:"<<str
<<endl;
input :a[ enter ][ Space ][ Space ]dd[ enter ]
find b One more blank line is output , This is because of the second character entered [ enter ] Deposited by b Print out , Then print the last one endl. remainder [ Space ][ Space ]dd Has been deposited str Print out .

(4) use cin.get ( char* s, int len ) Read a row of data ,n Is the size of the target space .
char a; char p[10]={}; cin.get(p,10); cin.get(a); cout<<"a:"<<a <<endl;
cout<<"strlen(p):"<<strlen(p) <<endl;
input :a[ Space ]b[ Space ]c
cin.get End reading data when a carriage return is encountered , take ’\n’ The previous content is stored in the target space , incorrect ’\n’ Do anything . after ’\n’ cover a obtain .

(5) stay while() Input data in the loop ,ctrl+d Can only be used to end acceptance char Type data .
vector<char> v; char c; cout << "inout:"; while (cin>>c) v.push_back (c);
cout << "v.size()= " << int(v.size()) << endl; for(auto & x:v) cout<<x<<" ";


In the face of int Type data ,ctrl+d It doesn't work . Input can only be terminated by entering a non numeric character . Because non numeric characters are not int Type data , therefore while() It is judged that false, Jump out of the loop .
vector<int> v; int c; cout << "inout:"; while (cin>>c) v.push_back (c); cout
<< "v.size()= " << int(v.size()) << endl; for(auto & x:v) cout<<x<<" ";

(6) stay while() Two consecutive pairs in a loop vector< int > input data . In the first one while(cin>>tmpVal) After use
cin.clear() To clear flase state , Combined use cin.ignore() To ignore this invalid character . In the second while(cin>>tmpVal) To continue to accept input .
vector<int> a; vector<int> b; int tmpVal; cout<<"input A:";
while(cin>>tmpVal) a.push_back(tmpVal); cin.clear(); // Clear error status cin.ignore();
// Skip invalid data cout<<"input B:"; while(cin>>tmpVal) b.push_back(tmpVal); cin.clear();
cin.ignore(); cout<<"output A:"; for(auto & x:a) cout<<x<<" "; cout<<endl;
cout<<"output B:"; for(auto & x:b) cout<<x<<" "; cout<<endl;

Technology