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
05-27 00:13