C++的io处理
C++的io处理
第一次C++作业前助教gg来讲了一些io相关的内容。对于一般向的考试而言,并不会像LeetCode那样为你提供好已经声明好的函数,而需要自行地处理输入输出这些问题,这也是为什么我们考试的时候往往会在输入输出上面耗费众多时间。
因此,为了防止机考的时候翻车,先记录一下第一次作业中积累的输入处理方法。
输入char
- 读入一个字符(包含空白符)
char c;
cin.get(c);
- 读入一个非空白符
char c;
cin >> c;
- 读取未知个数的字符(包含空白符)
char ch;
while(cin.get(ch)){
// do something
}
get 的返回值为 istream 对象,而 istream 对象可以转换为 bool 值,因而可以出现在 while 的条件中; >> 实际上会转换成函数 operator>> 的调用,函数的返回值也为 istream 对象(https://en.cppreference.com/w/cpp/io/basic_ios/operator_bool)
输入string
- 读入,以空白字符或EOF作为结束标志
cin >> s;
- 读入一行,以换行符(默认)或指定的字符(称为 delimiter)作为结束标志,delimiter 会被读取但不会出现在 s 中
getline(cin, s); //以换行符为结束标志
getline(cin, s, ','); //以,为结束标志
关于一行内有多种类型的输入
比如在matrix那道题中,我直接读入了形如“1 2 3 4 5 6”的字符串,我需要提取各个数字并转为int型存入数组中,因此我编写了一个split函数。此外main函数中使用了stoi将字符串转换为了int型变量。
vector<string> split(string s, char c){
vector<string> vec;
string temp;
for (char i : s) {
if (i != c){
temp += i;
}else{
vec.push_back(temp);
temp = "";
}
}
vec.push_back(temp);
return vec;
}
在倒数第i个单词的长度一题中,考虑到需要排除temp有可能为空的情况,我们可以加一行判断。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<string> split(string s, char c){
vector<string> ret;
string temp = "";
for(int i = 0; i < s.length();i++){
if(s[i] != c){
temp += s[i];
}else if(s[i] == c && !temp.empty()){
ret.push_back(temp);
temp = "";
}
}
ret.push_back(temp);
return ret;
}
int main(){
string input;
getline(cin, input);
vector<string> inputs = split(input, ' ');
int n = 0;
cin >> n;
cout << inputs[inputs.size() - n].size();
return 0;
}
总结
后续碰到新的io问题会继续更新在此博客中,总之我们要善用c++为我们提供的方便的STL,为我们的读写操作提供相应的便利。
- 标题: C++的io处理
- 作者: Kiyotaka Wang
- 创建于 : 2022-10-02 22:43:02
- 更新于 : 2022-11-21 13:03:25
- 链接: https://hmwang2002.github.io/2022/10/02/c-de-io-chu-li/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。