在NOIP
的“大模拟”题中,每每要对字符串进行读入并处理,这些字符串有可能包含空格并以\n做为分割,传统的cin >>
scanf()
等等,不可能达到要求,由于这些都是以\n
space
(空格) \t
(Tab) \r
做为分割符。ios
因此要处理字符串输入时,要以getline()
做为输入,输入后构造为【字符串流】,而后能够进行【分割】后进行任意处理。这是比较通用的作法,几乎能够适应全部状况。c++
#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 *
而后进行转换。spa
函数名称 | 说明 |
---|---|
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 |