OI中字符串读入和处理
在NOIP
的“大模拟”题中,往往要对字符串进行读入并处理,这些字符串有可能包含空格并以\n作为分割,传统的cin >>
scanf()
等等,不可能达到要求,因为这些都是以\n
space
(空格) \t
(Tab) \r
作为分割符。
通用处理方法
所以要处理字符串输入时,要以getline()
作为输入,输入后构造为【字符串流】,然后可以进行【分割】后进行任意处理。这是比较通用的做法,几乎可以适应所有情况。
#include<vector>
#include <sstream>
#include <iostream>
//分割为【单词】后进行处理,这是最通用的办法。
void Split(string &line, vector<string> &words)
{
string word;
//这个是in string stream 需要#include<sstream>,然后就可以用类似于 cin>>的方式任意处理了。
istringstream iss(line,istringstream::in);
while (iss >> word)
{
words.push_back(word);
}
}
int main()
{
string lines ;
//读入一行,可能会在结尾有\r,但不会包含\n,
std::getline(cin, lines);
//删除最后的 \r 如果要split的话,则可不调用
lines.erase(lines.find_last_of("\r"));
vector<string> words;
//分割为每个单词
Split(lines,words);
for (int i = 0; i < words.size(); i++)
{
cout << words[i] << endl;
}
其他可能用到的函数
getline(cin,string) | 从“流”中读入一行,读到\n 为止,有可能包括\r |
string::c_str() | 把 string 转换为 char * ,常用于转换后,再次转换为 int double 等 |
string::erase(pos = 0, len = npos); | 从pos 开始删除len 个字符,如果len 【缺省】,则删除到尾。 |
string::empty() | string 是否为空? |
string::length() string::size() | string 的长度,这两个是一样的。 |
string::find(str,pos = 0) | 【字符串】(字符查找需要用find_first_of )查找,默认从0开始 |
string::rfind(str,pos = npos) | 从右边查找 |
string::substr(pos = 0,len = npos | 获取子串,如果省略len ,就从pos 一直到结尾 |
string::replace(pos,len,str2); | 替换,把从pos开始,长度为len的部分替换为str2 |
string::find_first_of(string& str, pos = 0) | 字符查找(没有串),str 中任一匹配就算找到 |
string::find_last_of(string& str, pos = 0) | 从后往前找 |
可能用到的转换函数
在c++98
中是不能直接从string
转换为其他类型的(c++11
就可以),所以若需要转换则首先需要通过c_str()
转为为char *
然后进行转换。
strtol (char* str, char** endptr, int base) | 转换为base 进制的整形,endptr 为【转换】后【剩下】的,即没有转换成功的字符串, 可以为 null |
strtoll (char* str, char** endptr, int base) | 转换为base 进制的long long |
strtod(char* str, char** endptr); | 转换为double ,endptr 可以为 null |
strtold(char* str, char** endptr); | 转换为long double |