ACM输入输出总结

  • content {:toc}

1 基础

1.1 不知道具体行数,直到文件末尾( EOF )

输入样例:

1
2
3
1 2
3 4
5 6

输入代码

1
2
3
4
5
6
7
8
#include<iostream>
using namespace std;
int main() {
	int a, b;
	while (cin >> a >> b) {
        cout << a + b << endl;
    }
}

1.2 有具体行数

输入样例:

  • 输入 n+1 行
  • 第一行为n
  • 接下来 n 行代表….
1
2
5
1 2 3 4 5

代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// 输入 n+1 行
// 第一行为xxx
// 第二行为 xxx
#include<iostream>
using namespace std;
int main() {
	int n;
    cin>> n;
	for(int i = 0; i< n; ++i){
        // ...
    }
}

2 string

2.1 多组数据, 空格分隔每个字符串

输入样例

1
2
aaa bbb ccc
aaa bbb ccc
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main() {
string s1, s2;
    while (cin >> s1 >> s2) {
        //...
    }
    return 0;
}

2.2 输入一行为一个字符串

  • operator >> 有个问题, 遇到空格就停止
1
my name is li54426
1
2
3
4
5
6
7
8
9
#include<sstream>
#include<string>
#include<iostream>

int main{
    string line;
    // 获取一整行数组
    getline(cin, line);
}

2.3 多组数据, 一行为一个字符串

数据格式为

1
2
asd  ddd ddd
adsfa ddsf  dfasd
1
2
3
4
5
6
7
int main(){
    string line;
    while(getline(cin, line)) {  //依靠geline读入一行
      cout<< s<< endl;
    }
    
}

2.4 输入一行字符串, 从中查找数字

输入格式

1
"type:directReductionCoupon,price:50,isStackable:false"
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// "type:directReductionCoupon,price:50,isStackable:false"
// 需要分离出来数字等 

int main(){
    string s;
    cin>> s;
    
    int base = ss.find("price");
    int end = ss.find(",", base);
    string numstr = ss.substr(base+6 , end- base-6);
    double price = stod(numstr );
}

3 进阶—stringstream 的使用

3.1 输入方式为每行一个数组

输入样例

1
2
3
1 2 3       
4 5
0 0 0 0 0

代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#include<sstream>
#include<string>
#include<vector>
#include<iostream>

int main{
    vector<vector<int> > tree;
    string line;
    while(getline(cin, line)) {  //依靠geline读入一行
       stringstream ss(line);    //每行先读入字符串,然后再区分每个数字
        int num;
        int sum=0;  
        vector<int> nums;
        nums.clear();
        while(ss >> num){
            nums.push_back(nums);
        }
        tree.push_back(nums);
        
    }
}

3.2 输入方式为每行一个数组, 数字之间用逗号分隔

输入样例

1
2
1,2,3
4,5,6

代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 1,2,3
// sum = 6
#include<sstream>
#include<string>
#include<vector>
#include<iostream>

int main(){
    string line;
    while(getline(cin, line) ) {  //依靠geline读入一行
       stringstream ss(line);    //每行先读入字符串,然后再区分每个数字
        int num;
        int sum=0;  
        while(ss>> num){
            // 将逗号输出出去
            ss.get();
            sum += num; 
        }
             //计算总和
        cout<< "sum = "<< sum<< endl;
    }
    
}

string流类基础

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 输入流
stringstream ss;
ss << "GodFishhh";

// 输出为字符串形式
cout << ss.str() << endl;


// 偷看下一个字符, 流内还有字符
// "asdfasdf", 哪怕运行一万次, 也是输出 a
int peek();


// 获取字符
int get();


ostringstream oss;
oss << "GodFishhh and AFish" << " " << 20030331 << endl;
// 成员函数str()的无参数形式
cout << oss.str() << endl;
 
// 成员函数str()的有参数形式
// oss.str("with parameter");
oss.str("after ");
cout << oss.str() << endl;

ss << "AFish"<< endl;
cout << ss.str();

// 清空
ss.clear();
Licensed under CC BY-NC-SA 4.0
最后更新于 Oct 13, 2024 18:49 +0800
使用 Hugo 构建
主题 StackJimmy 设计