OJ在线编程:C++输入输出控制


练习网址:牛客网OJ在线编程常见输入输出练习场


1 键盘输入多组整型数据

1.1 输入多组数据

输入包括两个正整数a, b(1 <= a, b <= 10 ^ 9), 输入数据包括多组。
输出a + b的结果

输入:
1 5
10 20

输出:
6
30
int main() {
    int a, b;

    while (cin >> a >> b) {
        cout << a + b << endl;
    }
    return 0;
}

1.2 指定数据组数t,接下来t行输入多组数据

输入第一行包括一个数据组数t(1 <= t <= 100)
接下来每行包括两个正整数a, b(1 <= a, b <= 10 ^ 9)
输出a + b的结果

输入:
2
1 5
10 20

输出:
6
30
int main() {
    int t;
    cin >> t;

    int a, b;
    for (int i = 0; i < t; i++) {
        cin >> a >> b;
        cout << a + b << endl;
    }

    return 0;
}

1.3 输入多组数据,直至数据值等于给定值时停止

输入包括两个正整数a,b(1 <= a, b <= 10^9),输入数据有多组, 如果输入为0 0则结束输入
输出a+b的结果

输入:
1 5
10 20
0 0

输出:
6
30
int main() {
    int a, b;
    while (cin >> a >> b) {
        //输入数据为指定值时,终止输入
        if (a == 0 && b == 0) break;

        cout << a + b << endl;
    }

    return 0;
}

1.4 多组数据,每行第1个元素是当前行待输入元素的个数

输入数据包括多组。
每组数据一行,每行的第一个整数为整数的个数n(1 <= n <= 100)。
接下来n个正整数,即需要求和的每个正整数。
每组数据输出求和的结果

输入:
4 1 2 3 4
5 1 2 3 4 5

输出:
10
15
int main() {
    int n;
    vector<int> vec;

    while (cin >> n) {
        int num;
        for (int i = 0; i < n; i++) {
            cin >> num;
            vec.push_back(num);
        }

        int sum = 0;
        for (int i = 0; i < vec.size(); i++) {
            sum += vec[i];
        }
        cout << sum << endl;
        vec.clear();
    }
    return 0;
}

1.5 指定数据组数t,接下来t行输入多组数据;每行第1个元素是当前行待输入元素的个数

输入的第一行包括一个正整数t(1 <= t <= 100), 表示数据组数。
接下来t行, 每行一组数据。
每行的第一个整数为整数的个数n(1 <= n <= 100)。
接下来n个正整数, 即需要求和的每个正整数。
每组数据输出求和的结果

输入:
2
4 1 2 3 4
5 1 2 3 4 5

输出:
10
15
int main() {
    int t;
    int n;
    vector<int> vec;

    cin >> t;
    for (int i = 0; i < t; i++) {
        while (cin >> n) {
            int num;
            for (int i = 0; i < n; i++) {
                cin >> num;
                vec.push_back(num);
            }

            int sum = 0;
            for (int i = 0; i < vec.size(); i++) {
                sum += vec[i];
            }
            cout << sum << endl;
            vec.clear();
        }
    }

    return 0;
}

1.6 多组数据,每行第1个元素是当前行待输入元素的个数;直至第1个元素等于给定值时停止

输入数据包括多组。
每组数据一行,每行的第一个整数为整数的个数n(1 <= n <= 100), n为0的时候结束输入。
接下来n个正整数,即需要求和的每个正整数。
每组数据输出求和的结果

输入:
4 1 2 3 4
5 1 2 3 4 5
0

输出:
10
15

方法1:无参构造初始化vector

int main() {
    int n;
    vector<int> vec;

    while (cin >> n) {
        //每行第1个输入数据为指定值时,终止输入
        if (n == 0) break;

        int num;
        for (int i = 0; i < n; i++) {
            cin >> num;
            vec.push_back(num);
        }

        int sum = 0;
        for (int i = 0; i < vec.size(); i++) {
            sum += vec[i];
        }
        cout << sum << endl;
        vec.clear();
    }
    return 0;
}

方法2:有参构造初始化vector

int main() {
    int n;
    while (cin >> n) {
        if (n == 0) break;

        vector<int> vec(n, 0);
        for (int i = 0; i < n; i++) {
            cin >> vec[i];
        }

        int sum = 0;
        for (int i = 0; i < vec.size(); i++) {
            sum += vec[i];
        }
        cout << sum << endl;
        vec.clear();
    }
    return 0;
}

1.7 多组数据,每组数据个数不定,空格间隔

注:部分方法参考文章在线笔试C/C++攻克输入数据问题

输入数据有多组, 每行表示一组输入数据。
每行不定有n个整数,空格隔开。(1 <= n <= 100)。
每组数据输出求和的结果

输入:
1 2 3
4 5
0 0 0 0 0

输出:
6
9
0

(1)方法1:使用cin.get() == '\n',将回车作为结束符。

注:cin.get() == '\n'等价于getchar() == '\n'

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

int main() {
    vector<int> vec;
    int num;

    while (cin >> num) {
        int sum = 0;
        vec.push_back(num);

		//每行数据的末尾:当前键盘输入为换行符时
        if (cin.get() == '\n') {
            for (int i = 0; i < vec.size(); i++) {
                sum += vec[i];
            }
            cout << sum << endl;
            vec.clear();
        }
    }
    return 0;
}

(2)方法2:使用C语言的scanf("%d", &num) != EOF,循环读取每行的数据。

#include<stdio.h>
int main()
{
    int num,sum;
    sum = 0;
    while (scanf("%d", &num) != EOF) {
        sum = sum + num;
        if (getchar() == '\n') {
            printf("%d\n", sum);
            sum = 0 ;
        }
    }
    return 0;
}

(3)方法3:使用字符串流stringstreamgetline(cin , line)

注1:字符串流的类库<sstream>定义stringstreamostringstreamstringstream,分别实现C++风格字符串流的输入、输出、输入及输出的操作。
注2: getline函数可读取整行,包括前导和嵌入的空格,并将其存储在字符串对象中。

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

int main()
{
    string line;
    while (getline(cin, line))
    {
        stringstream linestream(line);
        int x;
        int sum = 0;
        while (linestream >> x)
        {
            sum += x;
        }
        cout << sum << endl;
    }
}

2 键盘输入二维动态数组

方法:动态数组的嵌套,使用cin.get() == '\n'判断每行的结束位置;使用cin.peek() == '\n'判断输入是否结束。
输入效果
①最后一个元素后使用空格时,只需按一次回车,即可结束键盘输入,输入缓冲区正常(不会多空一行)。
②最后一个元素后不使用空格时,需按两次回车,才能结束键盘输入,输入缓冲区会多空一行。

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

int main() {
	vector<vector<int>> outer;	//二维数组
	vector<int> inner;	//一维数组

	int num;
	while (cin >> num) {
		inner.push_back(num);

		//每行数据的末尾:当前键盘输入为换行符时
		if (cin.get() == '\n') {
			//将内层的一维数组inner,插入外层的二维数组中
			outer.push_back(inner);
			inner.clear();
		}

		//peek():从输入缓冲区观测并返回1个字符,不从输入缓冲区取走字符。
		if (cin.peek() == '\n') {
			outer.push_back(inner);
			break;
		}
	}

	cout << "----迭代器遍历----" << endl;
	//遍历二维数组:迭代器
	for (vector<vector<int>>::iterator uit = outer.begin(); uit != outer.end(); uit++) {
		for (vector<int>::iterator it = (*uit).begin(); it != (*uit).end(); it++) {
			cout << *it << " ";
		}
		cout << endl;
	}

	return 0;
}

3 键盘输入多组字符串数据

3.1 第一行指定字符串个数n,第二行输入n个字符串

输入有两行,第一行n
第二行是n个空格隔开的字符串
输出一行排序后的字符串,空格隔开,无结尾空格

输入:
5
c d a bb e

输出:
a bb c d e
#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <algorithm>

void printVector(const vector<string> &vec){
    for(int i = 0; i < vec.size(); i++){
        if(i != vec.size() - 1){
            cout << vec[i] << " ";
        }else{
            cout << vec[i] << endl;
        }   
    }
}

int main() {
    int n;
    string str;
    vector<string> vec;

    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> str;
        vec.push_back(str);
    }

    sort(vec.begin(), vec.end());

    printVector(vec);
    return 0;
}

3.2 多组数据,每组数据个数不定,空格间隔

多个测试用例,每个测试用例一行。
每行通过空格隔开,有n个字符,n<100
对于每组测试用例,输出一行排序过的字符串,每个字符串通过空格隔开

输入:
a c bb
f dddd
nowcoder

输出:
a bb c
dddd f
nowcoder
#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <algorithm>

void printVector(const vector<string> &vec){
    for(int i = 0; i < vec.size(); i++){
        if(i != vec.size() - 1){
            cout << vec[i] << " ";
        }else{
            cout << vec[i] << endl;
        }   
    }
}

int main(){
    int n;
    string str;
    vector<string> vec;
    
    while(cin >> str){
        vec.push_back(str);
        
        //每行数据的末尾:当前键盘输入为换行符时
        if(cin.get() == '\n'){
            sort(vec.begin(), vec.end());
            printVector(vec);
            vec.clear();
        }
    }
    return 0;
}

3.3 多组数据,每组数据个数不定,根据指定字符分割字符串

多个测试用例,每个测试用例一行。
每行通过逗号,隔开,有n个字符,n<100
对于每组用例输出一行排序后的字符串,用逗号’,'隔开,无结尾空格。

输入:
a,c,bb
f,dddd
nowcoder

输出:
a,bb,c
dddd,f
nowcoder

(1)解法1
使用istream标准输入流对象cingetline(cin , line)函数,从键盘输入接收一整行数据。
使用stringstream字符串流对象getline(ss, temp , ch)函数,根据指定字符分割字符串

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

void printVector(const vector<string> &vec){
    for(int i = 0; i < vec.size(); i++){
        if(i != vec.size() - 1){
            cout << vec[i] << ",";
        }else{
            cout << vec[i] << endl;
        }   
    }
}

int main(){
    int n;
    string line;    //一整行字符串
    string temp;    //被分割的字符串
    vector<string> vec;
    
    //每次读取一整行
    while(getline(cin, line)){
        //创建字符串流stringstream对象
        stringstream ss(line);
        
        //根据指定字符分割字符串
        while(getline(ss, temp, ',')){
            vec.push_back(temp);
        }
       
        sort(vec.begin(), vec.end());
        printVector(vec);
        vec.clear();
    }
    return 0;
}

(2)解法2:使用字符串的find()substr()函数,逐个分割字符串。

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

void SplitString(const string& s, vector<string>& v, const string& t)
{
    string::size_type pos1, pos2;
    pos2 = s.find(t);
    pos1 = 0;

    while (pos2 != string::npos)
    {
        v.push_back(s.substr(pos1, pos2 - pos1));
        pos1 = pos2 + t.size();
        pos2 = s.find(t, pos1);
    }

    if (pos1 != s.length()) {
        v.push_back(s.substr(pos1));
    }
}

void printVector(const vector<string> &vec){
    for(int i = 0; i < vec.size(); i++){
        if(i != vec.size() - 1){
            cout << vec[i] << ",";
        }else{
            cout << vec[i] << endl;
        }   
    }
}

int main(){
    int n;
    string line;    //一整行字符串
    string temp;    //被分割的字符串
    vector<string> vec;
    
    //每次读取一整行
    while(getline(cin, line)){
        SplitString(line, vec, ",");

        sort(vec.begin(), vec.end());
        printVector(vec);
        vec.clear();
    }
    return 0;
}

4 自定义C++字符串分割函数

参考1:C++ 使用 stringstream与getline()分割字符串
参考2:C++中String类的字符串分割实现

(1)使用stringstream字符串流对象getline(ss, temp , ch)函数,根据指定字符分割字符串

vector<string> splitStr(string str, char del) {
	stringstream ss(str);
	string temp;
	vector<string> ret;
	
	while (getline(ss, temp, del)) {
		ret.push_back(temp);
	}
	return ret;
}

(2)使用字符串的find()substr()函数,逐个分割字符串。

//源字符串s;目标字符串t
//场景示例:IP地址:192.168.66.88
vector<string> splitStr(const string& s, const string& t) {
    //存储分割后的字符串
    vector<string> res;
    string::size_type pos1, pos2;

    pos2 = s.find(t);
    pos1 = 0;

    while (pos2 != string::npos)
    {
        res.push_back(s.substr(pos1, pos2 - pos1));
        pos1 = pos2 + t.size();
        pos2 = s.find(t, pos1);
    }

    if (pos1 != s.length()) {
        res.push_back(s.substr(pos1));
    }

    return res;
}
相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页