OJ的输入输出总结C++版
最近在找实习,做笔试的时候,有时候连输入输出都要折腾很久,就大大降低了效率,总不能死在了输入输出上吧!自己平时熟悉C++,总结下C++常见的输入输出,希望下次笔试输入输出不再是问题:-)
OJ(Online Judge)的工作原理是我们提交程序,后台编译程序,然后执行编译好的程序,将结果保存在文件中,然后对比文件比较用户的输出和标准答案,然后得出通过率。
OJ模式的题目,程序需要stdin(标准输入)读取输入,然后stdout(标准输出)来打印结果,举个例子,你可以使用c++的cin来读取输入,然后使用c++的cout来输出结果。如果OJ一次处理多个case,代码需要循环处理,一般通过while循环来处理多个case。
常见的输入格式:
- 不知道输入数据的组数
- 知道输入数据的组数
- 字符串的输入
不知道输入数据的组数
计算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)
-
提取字符直到定界符。
-
将字符存储在缓冲区中。
-
提取的最大字符数为
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/