OI中字符串读入和处理

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
posted @ 2018-07-20 14:12  headchen  阅读(671)  评论(0编辑  收藏  举报