1.输入
首先,在C++语言中,要使用标准的输入,需要包含头文件<iostream>
1.1cin
cin是c++中标准的输入流对象,cin有两个用法,单独读入和批量读入
cin的原理:简单来讲,有一个缓冲区,键盘输入的数据会先存到缓冲区,用cin可以从缓冲区中读取数据。
注意:
- cin可以连续从键盘读入数据
- cin以空格,tab,换行符作为分隔符
- cin从第一个非空格字符开始读取,直到遇到分隔符结束读取
示例:
// 用法1,读入单数据
int num;
cin >> num;
cout << num << endl; // 输出读入的整数num
// 用法2,批量读入多个数据
vector<int> nums(5);
for(int i = 0; i < nums.size(); i++) {
cin >> nums[i];
}
// 输出读入的数组
for(int i = 0; i < nums.size(); i++) {
cout << nums[i] << " ";
}
1.2getline()
当读取的字符串中间存在空格时,cin会读取不全整个字符串,这个时候,需要用getline()
注意:
- 使用getline()函数的时候,需要包含头文件
<string>
- getline()函数会读取一行,读取的字符串包括空格,遇到换行符结束。
示例:
string s;
getline(cin, s);
// 输出读入的字符串
cout << s << endl;
1.3getchar()
该函数会从缓冲区读出一个字符,异常被用于判断是否换行
char ch;
ch = getchar();
// 输出读入的字符
cout << ch << endl;
注意:
getline会读取一行字符串(包括空格)遇到回车结束,getline(cin, s)会获取前一个输入的换行符,需要在前面添加读取换行符的语句,如getchar()或cin.get()
cin与getline()混用
cin输入完后,回车,cin遇到回车结束输入,但回车还在输入流中,cin不会清除,导致getline()读取回车,结束。需要在cin后面加cin.ignore();主动删除输入流中的换行符
2.输出
同样的,在C++语言中,要使用标准的输出,也需要包含头文件<iostream>
输出这边,主要介绍一个函数,就是用的最多的cout,需要注意的是,如果输出endl对象的时候,会输出一个换行符,类似\n
示例:
string s = "hello, Irray~";
// 看看二者有何不同
cout << "hello, Irray~";
cout << s << endl;
3.案例
3.1一维数组
此类输入,每个元素为一个int或char
3.1.1固定数目
输入格式1:
3
1 2 3
输入格式2:
3 1 2 3
解析:
对于第一组,第一行的3为整数的个数,第二行为三个用空格隔开的整数,因此可以采用cin来进行读取
对于第二组,第一行的3为整数的个数,空格后面的数据为三个用空格隔开的整数,因此可以采用cin来进行读取
此类问题,可以先创建一个vector,大小设置为给定值,然后通过for循环来循环输入
int n;
cin >> n; // 读入3,说明数组的大小是3
vector<int> nums(n); // 创建大小为3的vector<int>
for(int i = 0; i < n; i++) {
cin >> nums[i];
}
// 验证是否读入成功
for(int i = 0; i < nums.size(); i++) {
cout << nums[i] << " ";
}
cout << endl;
3.1.2不固定数目
输入格式:
1 2 3 4
解析:输入数据为四个用空格间隔的整数,没有指定整数个数,可以用while循环结合cin来处理
vector<int> nums;
int num;
while(cin >> num) {
nums.push_back(num);
// 读到换行符,终止循环
if(getchar() == '\n') {
break;
}
}
// 验证是否读入成功
for(int i = 0; i < nums.size(); i++) {
cout << nums[i] << " ";
}
cout << endl;
3.2二维数组
除了一维数组这种最基础的输入外,还会考察二维数组的输入,尤其是在dfs、dp类型的题目中。
二维数组主要有两种方式:常规模式和每一行数据是逗号隔开的整数
3.2.1常规模式
输入格式:
2 3
1 2 3
1 2 3
第一行的2,代表数据为2行,3代表数据为3列,因此根据第一行,可以得出,所输入数据为2行3列的二维数组。接下来的6个数字,就是按照空格和换行符分隔开的2x3二维数组,因此用for循环和cin即可处理
int m; // 接收行数
int n; // 接收列数
cin >> m >> n;
vector<vector<int>> matrix(m, vector<int>(n));
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
cin >> matrix[i][j];
}
}
// 验证是否读入成功
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
cout << matrix[i][j] << " ";
}
cout << endl;
}
3.2.2每一行数据是逗号隔开的整数
输入格式:
2 3
1,2,3
1,2,3
解析:
第一行的2,代表数据为2行,3代表数据为3列,因此根据第一行,可以得出,所输入数据为2行3列的二维数组。接下来的2行,分别是一个字符串,字符串中用逗号隔开每个整数。这里采用读入字符串的方式,并将读入的字符串进行按逗号分开。
int m; // 接收行数
int n; // 接收列数
cin >> m >> n;
vector<vector<int>> matrix(m);
for(