OJ的输入输出总结C++版

OJ的输入输出总结C++版

最近在找实习,做笔试的时候,有时候连输入输出都要折腾很久,就大大降低了效率,总不能死在了输入输出上吧!自己平时熟悉C++,总结下C++常见的输入输出,希望下次笔试输入输出不再是问题:-)

OJ(Online Judge)的工作原理是我们提交程序,后台编译程序,然后执行编译好的程序,将结果保存在文件中,然后对比文件比较用户的输出和标准答案,然后得出通过率。

OJ模式的题目,程序需要stdin(标准输入)读取输入,然后stdout(标准输出)来打印结果,举个例子,你可以使用c++的cin来读取输入,然后使用c++的cout来输出结果。如果OJ一次处理多个case,代码需要循环处理,一般通过while循环来处理多个case。

常见的输入格式:

  • 不知道输入数据的组数
  • 知道输入数据的组数
  • 字符串的输入

不知道输入数据的组数

[编程题]a+b

计算a+b的和

每行包含两个整数a和b

对于每行输入对应输出一行a和b的和

输入

1 5

输出

6

#include <iostream>
using namespace std;
int main() {
    int a,b;
    while(cin >> a >> b)//注意while处理多个case
        cout << a+b << endl;
    return 0;
}

知道输入数据的组数

先输入一个组数n,然后再循环读取n组数据。

#include <iostream>
using namespace std;
int main() {
    int n; // 数据的组数
    cin >> n; // 读取组数
    for(int i=0; i<n; ++i){
        int a, b;
        cin >> a >> b;
        cout << a+b <<endl;
    }
    return 0;
}

字符串的输入处理

因为OJ最终只比较文件,就不用保存所有输入,可以读一组数据计算一组数据。

当读取字符串的时候需要注意,cin不能读取空白字符,比如空格,如果遇到空格则会直接终止字符串。

#include <iostream>
#include <string>
using namespace std;
int main() {
	string s;
	cin >> s; // 读到空白就结束当前的字符串
	cout << s;
	return 0;
}

运行的结果:

abc 123
abc请按任意键继续. . .

如果要读取整行字符串,可以使用getline()cin.getline()这两个函数,两个函数都是遇到定界符,则结束这行的字符串,定界符默认设置为回车。两个函数略有不同的是,getline()操作的对象是string,cin.getline()操作的对象的char数组。详细的定义如下:

getline(),要使用这个函数需要包含头文件<string>,

istream& getline(istream& is, string& str, char delim);
istream& getline(istream& is, string& str);
  • is:它是istream类的对象,告诉函数从何处读取输入流。
  • str:这是一个string字符串对象,从流中读取输入后,将输入存储在此对象中。
  • delim:这是定界字符,它告诉函数在达到该字符后停止读取进一步的输入。
  • 返回值:此函数返回值是与输入参数is相同的输入流。
#include <iostream>
#include <string>
using namespace std;
int main() {
	string s;
	getline(cin, s);
	cout << s;	
	system("pause");
	return 0;
}		

运行结果:

abc 123
abc 123请按任意键继续. . .

cin.getline()函数读取至新行结尾或直到达到最大限制的整行文本。函数定义如下:

// (buffer, stream_size, delimiter)
istream& getline(char*, int size, char='\n')

// The delimiter character is considered as '\n'
istream& getline(char*, int size)
  1. 提取字符直到定界符。

  2. 将字符存储在缓冲区中。

  3. 提取的最大字符数为size-1

#include <iostream> 
using namespace std; 
int main() 
{ 
    char str[20]; 
    cin.getline(str, 20); 
    cout << str; 
    return 0; 
}

运行结果:

no bug forever
no bug forever请按任意键继续. . .

例子:

输入为9个数字,每个数字用逗号,分隔,将数字保存到一个一维数组中。

1,2,3,4,5,6,7,8,9

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

void test() {
	string str;
	cin >> str; // 获取整行数据
	vector<int> vec; // 将数字保存在数组中
	for (char& ch : str) {
		if (isdigit(ch)) vec.push_back(ch - '0'); // 如果是数字才保存,并且需要减去字符0
	}
	for (int& i : vec) {
		cout << i << ' ';
	}
}
int main() {
	test();
	system("pause");
	return 0;
}

运行结果:

1,2,3,4,5,6,7,8,9
1 2 3 4 5 6 7 8 9 请按任意键继续. . .

参考文章

https://www.nowcoder.com/discuss/276

https://www.geeksforgeeks.org/getline-string-c/?ref=rp

https://www.geeksforgeeks.org/getline-function-character-array/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章