【C++/笔试】传统OJ / ACM模式 读取输入总结

前言

  秋招第一次笔试,没怎么准备传统OJ(ACM模式)类型的题,逗号分隔+每排数量不一样的输入当场给我整麻了,吸取失败的经验教训,在此整理了ACM模式的输入读取处理。

1. 简单输入

1.1 空格间隔

输入几个变量的值,以空格隔开。
示例:
1 2

#include <iostream>
using namespace std;

int  main()
{
    int a,b;
    cin >> a >> b;
    //处理题目
    //cout << a <<" " << b << endl;
    return 0;
}

1.2 逗号间隔

输入几个变量的值,以逗号隔开。
//思路:用一个char型变量接收逗号。
示例:
1, 2, 3

#include<iostream>
using namespace std;

int  main()
{
    int a, b, c;
    char s;
    cin >> a >> s >> b >> s >>c;
    //处理题目
    //cout << a <<" " << b << " " << c <<endl;
    return 0;
}

2. n个输入

2.1 空格隔开

开始输入一个N,接下来输入N个数据,以空格隔开。
示例:
3
1 2 3

#include<iostream>
#include<vector>
using namespace std;

int  main()
{
    int n;
    cin >> n;
    vector<int> nums(n);
    for (int i = 0; i < n; ++i) 
    {
        cin >> nums[i];
    }    
    //处理题目
    /*for (int i = 0; i < n; ++i)
    {
        cout << nums[i] << " ";
    }*/
    return 0;
}

2.2 逗号隔开

开始输入一个N,接下来输入N个数据,以逗号隔开。
示例:
3
1,2,3

#include<iostream>
#include<vector>
using namespace std;

int  main()
{
    int n;
    cin >> n;
    char s;
    vector<int> nums(n);

    for (int i = 0; i < n - 1; ++i) {
        cin >> nums[i] >> s;
    }
    cin >> nums[n - 1];
    //处理题目
    /*for (int i = 0; i < n; ++i)
    {
        cout << nums[i] << " ";
    }*/
    return 0;
}

3. 不指定数量的一行输入

输入不指定数量的一行数据,以空格或逗号隔开。
//思路:不指定vector大小,逐个压入;通过cin.get()从缓存中读取一个字节,如果是换行符’\n’就终止。
示例1:
1 3 5 7 9
示例2:
2,4,6,8

#include<iostream>
#include<vector>
using namespace std;

int  main()
{
    vector<int> nums;
    int num;
    int n=0;
    while (cin >> num) {
        nums.push_back(num);
        ++n;
        if (cin.get() == '\n') break; //cin.get()可换为getchar()
    }
    //处理题目
    /*for (int i = 0; i < n; ++i)
    {
        cout << nums[i] << " ";
    }*/
    return 0;
}

4. n行,每行m个输入

4.1 空格间隔

开始输入一个N,接下来输入N行数据,每行有M个数据(题目给定或也在第一行输入),以空格隔开。
示例:
3 3
1 2 3
4 5 6
7 8 9

#include<iostream>
#include<vector>
using namespace std;

int  main()
{
    int n, m;
    cin >> n >> m;
    vector<vector<int>> nums(n,vector<int>(m));

    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < m; ++j)
        {
            cin >> nums[i][j];
        }
    }
    //处理题目
    /*for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < m; ++j)
        {
            cout << nums[i][j];
        }
        cout << endl;
    }*/
    return 0;
}

4.2 逗号间隔

开始输入一个N,接下来输入N行数据,每行有M个数据(题目给定或也在第一行输入),以逗号隔开。
示例:
3,3
1,2,3
4,5,6
7,8,9

#include<iostream>
#include<vector>
using namespace std;

int  main()
{
    int n, m;
    char s;
    cin >> n >> s >> m;
    vector<vector<int>> nums(n,vector<int>(m));

    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < m-1; ++j)
        {
            cin >> nums[i][j] >> s;
        }
        cin >> nums[i][m-1];
    }
    //处理题目
    /*for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < m; ++j)
        {
            cout << nums[i][j];
        }
        cout << endl;
    }*/
    return 0;
}

5. n行,每行不指定输入数量

开始输入一个N,接下来输入N行数据,每行不指定数据的数量,以空格或逗号隔开。
示例1:
3
1
1 2
1 2 3
示例2:
5
101,2
102,3
103,5
104,2,101,102
105,4,103

#include<iostream>
#include<vector>
using namespace std;

int  main()
{
    int n,num;
    char s;
    cin >> n;
    vector<vector<int>> nums(n);

    for (int i = 0; i < n; ++i)
    {
        while (cin >> num)
        {
            nums[i].push_back(num);
            if (cin.get() == '\n') break;
        }
    }
    //处理题目
    /*for (int i = 0; i < nums.size(); i++)
    {
        for (int j = 0; j < nums[i].size(); j++)
        {
            cout << nums[i][j] <<" ";
        }
        cout << endl;
    }*/
    return 0;
}

5.x 其他方法

仅限以逗号隔开的情况。

#include<iostream>
#include<sstream>
#include<string>
#include<vector>
using namespace std;

string replaceToSpace(string& s) {
    int len = s.size();
    cout << "长度为:" << len << endl;
    // 统计空格数量
    for (int i = 0; i < len; i++)
    {
        if (s[i] == ',')
            s[i] = ' ';
    }
    return s;
}

int main()
{
    int n;
    cin >> n;
    vector<vector<int>> nums(n);

    //读取一行数据为string,将逗号替换为空格,使用istringstream自动分隔字符串再输入给临时变量(自动将类型转换为int),压入第二层vector
    for (int i = 0; i < n; ++i) {
        string s;
        cin >> s;
        replaceToSpace(s);
        istringstream is(s);
        int tmp;
        while (is >> tmp)
        {
            nums[i].push_back(tmp);
        }
    }

    //处理题目
    /*for (int i = 0; i < nums.size(); i++)
    {
        for (int j = 0; j < nums[i].size(); j++)
        {
            cout << nums[i][j] << " ";
        }
        cout << endl;
    }*/
    return 0;
}

参考

ACM模式各种输入总结C++版
ACM题目中输入数据的处理(C++版)

结语

  秋招加油鸭~

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值