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 |
OI中字符串读入和处理的更多相关文章
- C++ 中字符串标准输入的学习及实验
声明:下面实验中[]里面表示要输入里面的符号,[]符号本身并未输入 1.cin>> cin使用空白(空格.制表符.回车)来确定字符串的结束位置. cin会将换行符留在输入输出队列中. #i ...
- [技术]浅谈OI中矩阵快速幂的用法
前言 矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中,矩阵的运算是数值分析领域的重要问题. 基本介绍 (该部分为入门向,非入门选手可以跳过) 由 m行n列元素排列成的矩形阵列.矩阵里的 ...
- OI中的莫比乌斯反演
OI中的莫比乌斯反演 莫比乌斯函数 想要学习莫比乌斯反演,首先要学习莫比乌斯函数. 定义 莫比乌斯函数用\(\mu(x)\)表示.如果\(x\)是\(k\)个不同质数的积,则\(\mu(x) = (- ...
- c++中字符串的截取:
c++中字符串的截取: string 类提供字符串处理函数,利用这些函数,程序员可以在字符串内查找字符,提取连续字符序列(称为子串),以及在字符串中删除和添加.我们将介绍一些主要函数. 1.函数fin ...
- C/C++中字符串String及字符操作方法
本文总结C/C++中字符串操作方法,还在学习中,不定期更新. .. 字符串的输入方法 1.单个单词能够直接用std::cin,由于:std::cin读取并忽略开头全部的空白字符(如空格,换行符,制表符 ...
- C语言中字符串详解
C语言中字符串详解 字符串时是C语言中非常重要的部分,我们从字符串的性质和字符串的创建.程序中字符串的输入输出和字符串的操作来对字符串进行详细的解析. 什么是字符串? C语言本身没有内置的字符串类型, ...
- SQL SERVER 将表中字符串转换为数字的函数 (详询请加qq:2085920154)
在SQL SERVER 2005中,将表中字符串转换为数字的函数共2个:1. convert(int,字段名) 例如:select convert(int,'3')2. cast(字段名 as i ...
- Java中字符串的几个实例
String str=new String("abc");new 对象时,位于堆中,同时看字符串常量中是否有字符串"abc",如果没有,则进行添加,同时进行关联 ...
- PHP中字符串的连接和换行
PHP中字符串的连接使用点,不是加号.换行\n需要用双引号括起来,不能用单引号. eg. <?php print_r("hello"."\n"); pri ...
随机推荐
- svn不是内部或外部命令?
svn不是内部或外部命令? 我的系统是Win7, [计算机]-->右键[属性]-->[高级系统设置]-->[环境变量]-->[系统变量 (S)]-->[Path]--&g ...
- AC日记——猴子 cogs 2043
2043. 猴子 ★★ 输入文件:monkeya.in 输出文件:monkeya.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] 有n只猴子,第一只尾巴挂在树上 ...
- Wireshark如何选择多行
Wireshark如何选择多行 在Wireshark中,用户经常需要选择几行,然后进行批量操作,如导出或者分析.但Wireshark没有提供通过鼠标直接选择多行的功能.这个时候,用户需要采用标记分 ...
- 济南day4
啥也不会,做了不对,对了没分.T1 50 + 30 + 0想了想,有思路,写了,半个小时写完,算错复杂度,复杂度最差(n*m),想成了(n+m)被卡没了50分,gg.....T2自己写了个单向并查集, ...
- mysql 设置默认id自增开始下标
alter table 表名 AUTO_INCREMENT 此处写你想让id从几开始增长的数字:
- C#深入学习:泛型修饰符in,out、逆变委托类型和协变委托类型
在C#中,存在两个泛型修饰符:in和out,他们分别对应逆变委托和协变委托. 我们知道,在C#中要想将一个泛型对象转换为另一个泛型对象时,必须要将一个泛型对象拆箱,对元素进行显式或隐式转换后重新装箱. ...
- 解决Sophos UTM 9防火墙上的“根分区填满”问题
Resolving 'Root Partition Is Filling Up' Issue on Sophos UTM Firewall 收到“Sophos UTM 9”防火墻的“根分區填满”问题的 ...
- C++静态库与动态库深入研究
什么是库 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可以被操 ...
- Solaris分布式文件系统NFS
NFS存在的意思是让不同unix系统之间可以传输数据.这样可以合理的利用资源. 对每一个系统,建立一个NFS文件系统,进行数据的备份. NFS守护进程: nfsd mountd locked st ...
- hadoop集群搭建datenode为0问题的解决
搭建了一个小的实验集群,一共4台机器,一台namenode,三台datenode.运行start-all,发如今namenode上没有报不论什么错误,可是启动后直接显示datenode数量为0. ...