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/