1、缓冲区
缓冲区是用来保存我们从键盘输入数据的地方,就是从键盘输入的数据并不是直接赋值,而是先进入缓冲区,然后被cin使用
基本方式: 键盘输入->按下enter按键——>进入缓冲区
enter按键:输入完成之后,需要按下enter按键将数据送入缓冲区,同时enter按键(\r)会自动编成换行(\n)进行保存,如输入123456一共六个字符,enter要计算,所以一共保存的是7个。
2、cin如何在缓冲区中读取数据
什么叫做分隔符
(1) tab空格、空格、换行
使用方式
(1)cin从缓冲区内读取内容
(2)如果没有,那么cin的成员函数(类似getline函数)会停止等待,直到有数据
(3)如果有数据,就触发cin>>读取,那么判断第一个字符,如果第一个字符是分隔符,cin>>会将其忽略并并清除,继续读取下一个。直到找到字符,读取字符之后后面如果还有数据,后面的分隔符就依然保存在缓冲区内,不读取(此处可以使用cin.getline()函数的特点了)
3、一些用法
(1)cin循环输入类型
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;
int main()
{
int num;
cin>>num;// 读取了1,但是回车还留在数据流中
// 如果没有下面这句话,str得不到准确的输入
// str 输出为空
cin.ignore();//把剩余的缓冲区内的数据清楚
string str;
getline(cin,str);//从缓冲区中读取一行以换行符为结尾的数据
cout << str.size() << endl;
return 0;
}
(2)缓冲区读取指定长度
// 读取以空格为分割的一行数据
/* 输入 :
1 2 3 4
输出 :
1 2 3 4
*/
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;
int main()
{
int num;
vector<int> nums;
int i = 3;//如果输入时,以空格间隔输入5个数,到最后nums中只会存储两个数,剩下的保存在缓冲区中
while(i--){// 遇到回车就停止输入
cin >> num
nums.push_back(num);
}
for(auto v : nums){
cout<<v<<" ";
}
cout<<endl;
return 0;
}
3、读取以逗号分割的数据
getline只能一行以string类型的数据
// 读取以,分割的一行数据
// 输入: 1,2,3,4,5
// 输出 1 2 3 4 5
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;
int main(){
string str;
getline(cin,str);
stringstream ss(str);
vector<int> nums;
string tmp;
while (getline(ss, tmp, ',')) {
nums.push_back(stoi(tmp));
}
//转换成long long类型
/*stringstream ss(s);
vector<long long>num;
string temp;
while (getline(ss, temp, ',')) {
num.push_back(strtoll(temp.c_str(), NULL, 10));
}*/
// 输出 1 2 3 4 5
for(auto v : nums){
cout<<v<<" ";
}
}
(4)封装一个以任意分割符分割字符串的函数
// str 为输入字符串,del为分隔符,返回分割之后的字符串数组
vector<string> split(string str, char del) {
stringstream ss(str);
string tmp;
vector<string> res;
while (getline(ss, tmp, del)) {
res.push_back(tmp);
}
return res;
}
文章转载自:https://blog.csdn.net/QT_continue/article/details/105715023
https://blog.csdn.net/qq_34525916/article/details/121379665