zoukankan      html  css  js  c++  java
  • OI中字符串读入和处理

    OI中字符串读入和处理

    NOIP的“大模拟”题中,往往要对字符串进行读入并处理,这些字符串有可能包含空格并以 作为分割,传统的cin >> scanf() 等等,不可能达到要求,因为这些都是以 space (空格) (Tab) 作为分割符。

    通用处理方法

    所以要处理字符串输入时,要以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 ;
    	//读入一行,可能会在结尾有
    ,但不会包含
    ,
    	std::getline(cin, lines);
    	//删除最后的 
     如果要split的话,则可不调用
    	lines.erase(lines.find_last_of("
    "));
    	vector<string> words;
    	//分割为每个单词
    	Split(lines,words);
    
    	for (int i = 0; i < words.size(); i++)
    	{
    		cout << words[i] << endl;
    	}
    

    其他可能用到的函数

    函数名称 说明
    getline(cin,string) 从“流”中读入一行,读到 为止,有可能包括
    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
  • 相关阅读:
    8张图带你轻松温习 Java 知识.md
    关于 Java 序列化你不知道的 5 件事
    为什么 String 是不可变的?
    如何使用 Nginx 优雅地限流?
    JAVA泛型编程笔记
    java_接口的应用
    java_抽象类应用
    深入理解Java的接口和抽象类
    java_重写与重载的区别
    Java:按值传递还是按引用传递详细解说
  • 原文地址:https://www.cnblogs.com/headchen/p/9341170.html
Copyright © 2011-2022 走看看