ACM输入接口合集

输入形式一

输入解释:第一行代表输入操作的次数。后续分别进行各自操作的输入。操作分为“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.条件状态

参考文献:

C++ cin 详解之终极无惑_恋喵大鲤鱼的博客-CSDN博客_c++ cin

C++ cin.getline用法详解 (biancheng.net)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值