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中字符串读入和处理的更多相关文章

  1. C++ 中字符串标准输入的学习及实验

    声明:下面实验中[]里面表示要输入里面的符号,[]符号本身并未输入 1.cin>> cin使用空白(空格.制表符.回车)来确定字符串的结束位置. cin会将换行符留在输入输出队列中. #i ...

  2. [技术]浅谈OI中矩阵快速幂的用法

    前言 矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中,矩阵的运算是数值分析领域的重要问题. 基本介绍 (该部分为入门向,非入门选手可以跳过) 由 m行n列元素排列成的矩形阵列.矩阵里的 ...

  3. OI中的莫比乌斯反演

    OI中的莫比乌斯反演 莫比乌斯函数 想要学习莫比乌斯反演,首先要学习莫比乌斯函数. 定义 莫比乌斯函数用\(\mu(x)\)表示.如果\(x\)是\(k\)个不同质数的积,则\(\mu(x) = (- ...

  4. c++中字符串的截取:

    c++中字符串的截取: string 类提供字符串处理函数,利用这些函数,程序员可以在字符串内查找字符,提取连续字符序列(称为子串),以及在字符串中删除和添加.我们将介绍一些主要函数. 1.函数fin ...

  5. C/C++中字符串String及字符操作方法

    本文总结C/C++中字符串操作方法,还在学习中,不定期更新. .. 字符串的输入方法 1.单个单词能够直接用std::cin,由于:std::cin读取并忽略开头全部的空白字符(如空格,换行符,制表符 ...

  6. C语言中字符串详解

    C语言中字符串详解 字符串时是C语言中非常重要的部分,我们从字符串的性质和字符串的创建.程序中字符串的输入输出和字符串的操作来对字符串进行详细的解析. 什么是字符串? C语言本身没有内置的字符串类型, ...

  7. SQL SERVER 将表中字符串转换为数字的函数 (详询请加qq:2085920154)

    在SQL SERVER 2005中,将表中字符串转换为数字的函数共2个:1. convert(int,字段名)   例如:select convert(int,'3')2. cast(字段名 as i ...

  8. Java中字符串的几个实例

    String str=new String("abc");new 对象时,位于堆中,同时看字符串常量中是否有字符串"abc",如果没有,则进行添加,同时进行关联 ...

  9. PHP中字符串的连接和换行

    PHP中字符串的连接使用点,不是加号.换行\n需要用双引号括起来,不能用单引号. eg. <?php print_r("hello"."\n"); pri ...

随机推荐

  1. 三、 java运算符与流程控制

    赋值运算 赋值运算符:=,+=,-=,×=,/=,%= class fuzhiyunsuan{ public static void main(String[] args){ int i1 = 10; ...

  2. 关于vsftp所遇问题

    问题:使用ftp工具上传文件时提示 553 Could not create file.错误: 严重文件传输错误解决方法:除了检查ftp服务外,需要使用 getsebool -a|grep ftp, ...

  3. Java 内存查看与分析

    1:gc日志输出 在jvm启动参数中加入 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimestamps -XX:+PrintGCApplication ...

  4. SQLite数据库中rowid使用

    SQLite数据库中rowid使用   SQLite中每个表都默认包含一个隐藏列rowid,使用WITHOUT ROWID定义的表除外.通常情况下,rowid可以唯一的标记表中的每个记录.表中插入的第 ...

  5. fastscript增加公共函数

    fastscript增加公共函数 unit fs_BsCommFuncs; interface{$i fs.inc}uses SysUtils, Classes, fs_iclassesrtti, f ...

  6. iOS Framework: Introducing MKNetworkKit (MKNetworkKit介绍,入门,翻译)

    这片文章也有塞尔维亚-克罗地亚语(由Jovana Milutinovich翻译)和日语(由@noradaiko翻译) 如果有个一个网络库能够自动的为你处理cache该有多好啊. 如果有一个网络库能够在 ...

  7. mac升级系统自带numpy失败解决方案

    sudo pip install -U numpy 后抛出 OSError: [Errno 1] Operation not permitted: '/tmp/pip-o2xinZ-uninstall ...

  8. POJ 1018 Communication System 题解

    本题一看似乎是递归回溯剪枝的方法.我一提交,结果超时. 然后又好像是使用DP,还可能我剪枝不够. 想了非常久,无奈忍不住偷看了下提示.发现方法真多.有贪心,DP,有高级剪枝的.还有三分法的.八仙过海各 ...

  9. android-BroadcastReceive广播接收器

    应用可以使用它对外部事件进行过滤,只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应.广播接收器没有用户界面.然而,它们可以启动一个activity或service来响应它们 ...

  10. c++对象模型和对象内存布局

    简单对象模型:如下图所示: 每一个object是一系列的slots,每一个data member或者function member都有自己的一个slot.这种模型的空间和执行效率都很低.在这个模型中, ...