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

最新文章

  1. [LeetCode] Minimum Depth of Binary Tree 二叉树的最小深度
  2. MongoDB学习笔记~管道中的分组实现group+distinct
  3. Rightmost Digit
  4. Map集合案例
  5. 新手安装使用codeblocks
  6. Chapter 1 First Sight——5
  7. Dynamics CRM 删除字段时检测到有组件类型为查看的依赖组件而无法删除问题
  8. tkinter中menu菜单控件(十二)
  9. GitHub开源:SQLite 增强组件 Sheng.SQLite.Plus
  10. 《JavaScript高级程序设计》笔记:DOM扩展(十一)
  11. [paper reading] C-MIL: Continuation Multiple Instance Learning for Weakly Supervised Object Detection CVPR2019
  12. 应用篇 = Docker下的Redis
  13. SQLite的sqlite3_prepare_v2
  14. SpringCloud之Hystrix断路器以及dashboard 属性详解
  15. semantic segmentation 和instance segmentation
  16. 如何解决每次打开office 都会出现正在配置的问题
  17. Jenkins系列之Jenkins的安装
  18. lnmp升级php
  19. easyui datagrid 去掉 全选checkbox
  20. New Moto X 2014 全版本RSD&amp;Fastboot刷官方底包教程

热门文章

  1. C#实现键盘钩子
  2. Struts2的上传与下载
  3. Java RandomAccessFile类
  4. Windows下Python的虚拟环境
  5. Spring MVC中@ControllerAdvice注解实现全局异常拦截
  6. iOS -- SKTransition类
  7. hive界面工具SQL Developer的安装;使用sql developer连接hive;使用sql developer连接mysql
  8. angular - 编辑html文件-4
  9. hdu 1548
  10. Codeforces 569 B. Inventory