输入形式一
输入解释:第一行代表输入操作的次数。后续分别进行各自操作的输入。操作分为“1”和“2”,“1”代表插入数据,后面是名字,以及当前姓名所关注内容的数量,因此接下来输入关注内容的名称。以1 Alice 2为例,1代表操作类型,Alice代表姓名,2代表关注的数量,因此接下来输入的是Zoom,Apple也是Alice所关注的内容。“2”代表查找操作,只输入姓名。
代码
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
int pnums = 0;
// 获取操作次数
cin >> pnums;
// ignore 代表上一个输入截止,上一个参数不再接收参数
cin.ignore();
while (pnums--)
{
int ptype = 0;
// 获取操作 类型
cin >> ptype;
// 这里 通过 忽略一个空格 来结束上一个输入
cin.ignore();
if (ptype == 1)
{
// 获取 用户名字
char temp;
string namedata;
while (cin.get(temp) && temp != ' ')
{
namedata.push_back(temp);
}
// 获取用户关注内容分数量
int contentsNum = 0;
cin >> contentsNum;
cin.ignore();
// 输入关注 内容
char data[100];
cin.getline(data, 100);
vector<string> contents(contentsNum);
int tempnums = 0;
for (auto& i : data)
{
if (i == ' ')
{
tempnums++;
}
else if (i == '\0')
break;
else
{
contents[tempnums] += i;
}
}
cout << "输出所获得的信息:" << endl;
cout << "操作类型:" << ptype <<endl;
cout << "客户名字:" << namedata << " 客户关注内容:";
for (auto& i : contents)
{
cout << " " << i;
}
cout << " " << endl;
}
else if (ptype == 2)
{
char temp;
string namedata;
while (cin.get(temp) && temp != '\n')
{
namedata.push_back(temp);
}
cout << "输出所获得的信息:" << endl;
cout << "客户名字:" << namedata << endl;
}
}
return 0;
}
读取形式二
输入未知长度的数组
vector<int> arr;
int temp2;
while (cin >> temp2)
{
arr.emplace_back(temp2);
if ('\n' == cin.get())
{
break;
}
}
但是有一次测试,会出现bug,检测不到回车,尤其是输入长度不断增加时,不知道系统测试的时候是否会出现这种情况
cin用法总结
首先使用cin读取输入参数的方式有
1.cin >> [char,int,float,string],结束标志有三种,空格;tab;换行;代表当前输入结束。
int main()
{
int a = 0;
float b = .0;
char c = '\0';
int a2 = 0;
cin >> a >> b >> c >> a2;
cout << "a:" << a << " b:" << b
<< " c:" << c << " a2:" << a2 << endl;
int d = 0;
if (!(cin>>d))
cout << " 输入 false" << endl;
else
cout << " 输入 true" << endl;
int i = 4;
while (cin >> d && i--)
{
cout << "d:" << d << endl;
}
return 0;
}
1.1绿色框测试目的是测试输入的类型,分别测试tab和空格,都不会终止输入,输入回车就会终止输入,可以看到a2没有输入上值。
1.2黄色框测试的目的是判断输入时是真还是假,从结果可以看出输入值是真。
1.3紫色框测试的目的是测试连续输入,可以看出空格和tab都不会中断当前输出,但是回车之后会输出已经输入的结果,但是次数没结束,因此再输入416之后才结束。
1.4读取string类型时,只有遇到回车、tab和空格才会终止读取。
总结:
1)cin>> 等价于 cin.operator>>(),即调用成员函数 operator>>() 进行读取数据。
2)当 cin>> 从缓冲区中读取数据时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin>> 会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。但是如果读取成功,字符后面的分隔符是残留在缓冲区的,cin>> 不做处理。(绿色框和紫色框均可以验证)
2.cin.getline(字符数组名,字符个数,结束标志),读取一行输入。
第一个参数是要存储字符串的数组的名称。第二个参数是数组的大小。第三个当第三个参数省略时,系统默认为'\0'。
当 cin.getline 语句执行时,cin 读取的字符数将比该数字少一个,为 null 终止符留出空间。直到它读取至最大指定的字符数,或直到按下了回车键,将停止读取,并且将缓冲区的内容删除。因此遇到 ‘\n’ 时终止,并且将 ‘\n’ 直接从输入缓冲区中删除掉,不会影响下面的输入处理。
int main()
{
char a;
char b[5];
cin.getline(b, 5);
cin.get(a);
cout << "b:" << b << " a:" << a << endl;
}
但是输入越界时,cin.get()会无法继续接收输入(左图所示),而没有越界时,回车之后,cin.get()可以继续接收输入字符。。
3.cin.get(),有四种重载形式
int get();
istream& get(char& var);
istream& get( char* s, streamsize n );
istream& get( char* s, streamsize n, char delim);
整体来说与cin.getline没有太大的区别。
cin.get() 从输入缓冲区读取单个字符时不忽略分隔符,直接将其读取
cin.get() 的返回值是 int 类型,成功则返回读取字符的 ASCII 码值。
cin.get(char var) 如果成功返回的是 cin 对象,因此支持链式操作,如cin.get(b).get(c)
4.条件状态