C++输入
1 数字类型
注意:下面的案例我在笔试中都遇见过,如果输入输出出现问题,那就凉了。不妨记m为矩阵行数、n为列数。
1.1 一行中一个、两个、多个数字
1 一行中只有一个输入
5
int n;
cin >> n;
如果有多行测试案例,可以使用while
进行循环读取
5
// other data
7
// other data
...
int n;
while (cin >> n) {
// do something
}
2 一行中只有两个输入
5 4
int m, n;
while (cin >> m >> n) {
// do something
}
3 两个输入共两行
5
4
int m, n;
while (cin >> m && cin >> n) {
// do something
}
注意:这种输入,故意将矩阵的行数和列数分成两行,注意分辨
4 一行中多个数字
5
0 2 6 9 10
int n;
while (cin >> n) {
vector<int> nums;
int temp;
for (int i = 0; i < n; ++i) {
cin >> temp;
nums[i] = temp;
}
// do something
}
1.2 一行多个数字以逗号分隔
0,2,6,9,10
string line;
while (cin >> line) {
istringstream iss(line); /**<将line转成输入字符串流,之后就可以分割 */
string word; /**<每次处理的结果 */
vector<int> nums;
while (getline(iss, word, ','))
nums.push_back(stoi(word));
// do something
}
注意:典型的以逗号分隔输入
- cin读取到空格或者回车换行都会停止读取,因此如果输入一行中没有空格,可以使用cin,如果有空格需要使用getline
- getline这句应该这样理解,处理iss中的字符串,
遇到分隔符','
。结果放在word
,如此反复,直到流的末尾,也就实现了字符串的分割。 - 使用
stoi
就可以转成数字了
注意:
- 其实上面的代码在某些情况下是有问题的,比如多个分隔符连在一起(1,5),或者有空格。
1.3 一个相对完整的代码
,0,,6,9,10
string line;
while (getline(cin, line)) {
istringstream iss(line); /**<将line转成输入字符串流,之后就可以分割 */
string word; /**<每次处理的结果 */
vector<int> nums;
while (getline(iss, word, ',')) {
// cout << word << '\n';
if (!word.empty()) /**<改变了这里 */
nums.push_back(stoi(word));
}
// do something
}
注意:虽然简单的改了下代码,但是这个模板可以处理大多数输入问题
- 读者可以去除上面代码的注释,观察word是什么,对于上面的案例
空格
0
空格
6
9
10
- 因此word其实是
两个分隔符之间
的东西 - stoi是C++的字符串转整数的函数,对于C语言有atoi,两者有区别,对于输入是
空格串
,stoi的行为是宜昌,而atoi的行为是0
2 字符串类型
2.1 cin和getline混读问题
下面的案例代码接下来有3行输入
3
xxx xxx xxx
yyy yyy yyy
zzz zzz zzz
int n;
while (cin >> n) {
cin.get(); /**<cin和getline混读的问题,需要读走之前 */
vector<string> strs(n);
for (int i = 0; i < n; ++i) {
getline(cin, strs[i]);
}
// do something
}
注意:如果没有cin.get()
会导致错误,下面分析下原因
- cin
读取数字
遇到空格会忽略,遇到’\n’表象是忽略了。实际上把它读取了,但是又放回到缓存里 - 所有接下来的getline第一个读取的是空串,因此使用一个
cin.get()
读走一个字符,即’\n’
2.2
3 输出格式
3.1 一般而言,输出都需要换行’\n’
3.2 保留固定的小数位数
1 在一个人民币的案例中,需要结果保留两位小数
例如
:将
π
\pi
π 输出成3.14
一个C语言版本
double pi = 3.14159;
printf("%0.2f\n", pi);
一个C++语言版本
double pi = 3.14159;
cout << fixed << setprecision(2) << pi << '\n';
我个人喜欢用C语言版本,C++考试的时候记不住~~~
3.3 cin.tie(0),cout.tie(0),ios_sync_with(0) ?
C++输入输出并不是比C慢,因为C++做了更多的兼容考虑
,所以使用中C++输入输出慢些。
这句代码就是关闭兼容特性,效率和C语言的scanf和printf一致。
注意:使用了这句代码,绝对不要混用C和C++的输入输出。
3.4 C++输出字符char
C++的重载运算符不能直接输出char字符,意思是int类型需要强转下。
int ch = 'a';
cout << (char)ch << '\n';