• String类及字符串处理


    string初始化方式

    string类有8种初始化方式:

    char temp[]="abcdefghigklmn";
    
    序号 用法 输出
    1 string one("Hello Kitty!"); Hello Kitty!
    2 string two(3,'$'); $$$
    3 string three(one); Hello Kitty!
    4 string four=two+three; $$$Hello Kitty!
    5 string five(five,4); abcd
    6 string six(temp+2,temp+6); cdef
    7.1 string seven1(&six[1]); def
    7.2 string seven2(&six[1],&six[3]); de
    8 string eight(six,1,3); de

    string成员

    查找搜索

    说明,索引(size_type)即第几个字符。如“qwer”中‘e’的索引为2.
    string str="abcdefg";
    string st="cd";

    方法 说明
    str.size() 返回字符数
    str.length() 返回字符数
    string::npos 字符串可存储的最大字符数
    str.find("cd",1) 从str的第2个位置开始查找字符串cd
    str.find(st,1) 从str的第2个位置开始查找字符串st
    str.find("cd",1,4) 从str的第2个位置开始到第5个位置查找字符串cd
    str.find(st,1,4) 从str的第2个位置开始到第5个位置查找字符串st

    字符访问

    命令 功能
    string::at –访问特定字符,带边界检查
    string::operator[] –访问特定字符
    string::front –访问第一个字符
    string::back –访问最后一个字符
    string::data –访问基础数组,C++11 后与 c_str() 完全相同
    string::c_str –返回对应于字符串内容的 C 风格零结尾的只读字符串
    string::substr –以子串构造一个新串;参数为空时取全部源串

    迭代器

    命令 功能
    string::begin –获得指向开始位置的迭代器
    string::end –获得指向末尾的迭代器
    string::rbegin –获得指向末尾的逆向迭代器
    string::rend –获得指向开始位置的逆向迭代器
    string::cbegin –获得指向开始位置的只读迭代器
    string::cend –获得指向末尾的只读迭代器
    string::crbegin –获得指向末尾的逆向只读迭代器
    string::crend –获得指向开始位置的逆向只读迭代器

    容量

    命令 功能
    string::empty –检查是否为空
    string::size –返回数据的字符长度
    string::length –返回数据的字符长度,与 size() 完全相同
    string::max_size –返回可存储的最大的字节容量,在 32 位 Windows 上大概为 43 亿字节。
    string::reserve –改变 string 的字符存储容量,实际获得的存储容量不小于 reserve 的参数值。
    string::capacity –返回当前的字符存储容量
    string::shrink_to_fit (C++11 新增)–降低内存容量到刚好

    修改器

    命令 功能
    string::clear –清空内容
    string::insert –插入字符或字符串。如果参数仅为一个迭代器,则在其所指位置插入0 值。
    string::erase –删除 1 个或 1 段字符
    string::push_back –追加 1 个字符
    string::pop_back –删除最后 1 个字符,C++11 标准引入
    string::append –追加字符或字符串
    string::operator+= –追加,只有一个参数——字符指针、字符或字符串。
    string::copy –拷贝出一段字符到 C 风格字符数组;有溢出危险
    string::resize –改变(增加或减少)字符串长度;如果增加了字符串长度,新字符缺省为 0 值
    string::swap –与另一个 string 交换内容
    string::replace –替换子串;如果替换源数据与被替换数据的长度不等,则结果字符串的长度发生改变

    搜索

    命令 功能
    string::find –前向搜索特定子串的第一次出现
    string::rfind –从尾部开始,后向搜索特定子串的第一次出现
    string::find_first_of –搜索指定字符集合中任意字符在 *this 中的第一次出现
    string::find_last_of –搜索指定字符集合中任意字符在 *this 中的最后一次出现
    string::find_first_not_of –*this 中的不属于指定字符集合的首个字符
    string::find_last_not_of –*this 中的不属于指定字符集合的末个字符
    string::compare –与参数字符串比较

    例程:将字符串转化为数字

    #include <iostream>
    #include <string>
    
    int main()
    {
       std::string date = "2019-09-27";
       int stringToNum = atoi((date.substr(0, 4)).c_str());
    
       std::cout << "the number is:"<<stringToNum << std::endl;
    
       return 0;
    }
    

    substr()是取字符串的部分字符;
    c_str()接口是string类的一个函数,返回的是字符串的首地址,返回值类型是const char *。如果要使用它并对其进行赋值操作,必须要使用strcpy函数.如果哦直接进行赋值,是不会赋值成功的;
    atoi (表示 ascii to integer)是把字符串转换成整型数的一个函数。

    最大长度

    string类的最大长度为unsigned int的最大值;

    字符串转数值

    #include <string>
    
    string方法 作用
    stoi(s,p,b) 把字符串s从p开始转换成b进制的int
    stol(s,p,b) 把字符串s从p开始转换成b进制的long
    stoul(s,p,b) 把字符串s从p开始转换成b进制的unsigned long
    stoll(s,p,b) 把字符串s从p开始转换成b进制的long long
    stoull(s,p,b) 把字符串s从p开始转换成b进制的unsigned long long
    stof(s,p) 把字符串s从p开始转换成float
    stod(s,p) 把字符串s从p开始转换成double
    stold(s,p) l把字符串s从p开始转换成long double
    #include <stdlib.h>
    
    c标准库方法 作用
    atof(s) 将字符串s[n]转换为双精度浮点型值。
    atoi(s) 将字符串s[n]转换为整型值。
    atol(s) 将字符串s[n]转换为长整型值。
    strtod(s,*p,b) 将字符串s[n]转换为b进制双精度浮点型值,到p停止,并报告不能被转换的所有剩余数字。
    strtol(s,*p,b) 将字符串s[n]转换为b进制长整值,到p停止,并报告不能被转换的所有剩余数字。
    strtoul(s,*p,b) 将字符串s[n]转换为b进制无符号长整型值,到p停止,并报告不能被转换的所有剩余数字。

    数值转化为字符串

    #include <string>
    using std::to_string;
    
    string to_string (int val);
    string to_string (long val);
    string to_string (long long val);
    string to_string (unsigned val);
    string to_string (unsigned long val);
    string to_string (unsigned long long val);
    string to_string (float val);
    string to_string (double val);
    string to_string (long double val);
    

    进制转换

    strtol()函数

    任意进制转换为10进制。
    base是要转化的数的进制,非法字符会赋值给endptr,nptr是要转化的字符。

    #include<cstdio>
    int main()  
    {  
        char buffer[20]="10549stend#12";  
        char *stop;  
        int ans=strtol(buffer, &stop, 8);   //将八进制数1054转成十进制,后面均为非法字符
        printf("%d
    ",ans);  
        printf("%s
    ", stop);   
        return 0;
    }
    
    556
    9stend#12
    

    itoa()函数

    将一个10进制数转换为任意的2-36进制字符串。
    num是一个int型的,是要转化的10进制数,str是转化结果,后面的值为目标进制。

    #include<cstdio> 
    #include<cstdlib> 
    int main()  
    {  
        int num = 10;  
        char str[100];  
        _itoa(num, str, 2);  //c++中一般用_itoa,用itoa也行,
        printf("%s
    ", str);  
        return 0;  
    }
    

    读取字符串的三种姿势

    cin

    cin>>该输入操作符是根据后面变量的类型读取数据。输入结束条件 :遇到Enter、Space、Tab键。(这个很重要!)对结束符的处理 :当第一个字符为分隔符时丢弃缓冲区中的结束符,当还存在其他cin输入时,会输出下一个非结束符字符串数据。

    重要:当cin>>从缓冲区中读取数据时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin>>会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。但是如果读取成功,字符后面的分隔符是残留在缓冲区的,cin>>不做处理。

    cin.get()

    该函数有三种格式:无参,一参数,二参数即cin.get(),cin.get(char ch), cin.get(array_name, Arsize)
    读取字符
    输入结束条件:Enter键对结束符处理:不丢弃缓冲区中的Enter、space和TAB(重要)。
    cin.get()与cin.get(char ch)用于读取字符,他们的使用是相似的,即:ch=cin.get()与cin.get(ch)是等价的。
    读取字符串
    cin.get(array_name, Arsize)是用来读取字符串的,可以接受空格字符,遇到Enter结束输入,按照长度(Arsize)读取字符, 会丢弃最后的Enter字符(重要,但是不丢弃SPACE和TAB)。

    cin.getline()

    cin.getline()与 cin.get(array_name,Arsize)的读取方式差不多,以Enter结束,可以接受空格字符。按照长度(Arsize)读取字符, 会丢弃最后的Enter字符。
    但是这两个函数是有区别的:
    cin.get(array_name, Arsize)当输入的字符串超长时,不会引起cin函数的错误,后面的cin操作会继续执行,只是直接从缓冲区中取数据。
    但是cin.getline()当输入超长时,会引起cin函数的错误,后面的cin操作将不再执行。

    cin错误函数

    cin的错误处理机制,并且学习几个重要的函数:cin.fail(), cin.bad(), cin.good(), cin.clear(), cin.ignore()等。

    ios::badbit    001   输入(输出)流出现致命错误,不可挽回

    ios::eofbit    010   已经到达文件尾

    ios::failbit   100   输入(输出)流出现非致命错误,可挽回

    ios::goodbit   000   流状态完全正常, 各异常标志位都为0

    相应的函数1 or true if rdstate & XXbit is nonzero; otherwise 0。

    cin.clear()的作用是重置错误标志。
    重置错误标志还不够!要是能将缓冲区的残留数据清空了就好了哦!下面我们再来看一个很重要的函数!

    basic_istream&ignore(streamsize _Count = 1, 
    					int_type _Delim = traits_type::eof());
    

    这个函数用来丢弃输入缓冲区中的字符,第一参数定义一个数,第二个参数定义一个字符变量。下面解释一下函数是怎样执行的:函数不停的从缓冲区中取一个字符,并判断是不是_Delim,如果不是则丢弃并进行计数,当计数达到_Count退出,如果是则丢弃字符退出。例:cin.ignore(5, 'a'); 函数将不断从缓冲区中取一个字符丢弃,直到丢弃的字符数达到5或者读取的字符为'a'。

    参考链接:
    https://wikipedia.sogou.se/wiki/String_(C%2B%2B标准库)
    https://blog.csdn.net/sinat_40872274/article/details/81367815
    https://blog.csdn.net/caimouse/article/details/78833505
    https://blog.csdn.net/Hadwin1991/article/details/81545863
    https://blog.csdn.net/vir_lee/article/details/80645066

  • 相关阅读:
    函数指针作为函数參数,实现冒泡排序的升序排序和降序排序
    为什么通过空指针(NULL)能够正确调用类的部分成员函数
    vc6.0 点编译时提示Cannot complile the file &#39;D:souce-codevc-workspace对话框MainFrm.h&#39;; no compile tool is
    struts2中Action訪问servlet的两种方式
    删除LINUX更新后多余的内核
    cocos2d-x 3.0rc2版公布了
    The user specified as a definer (&#39;root&#39;@&#39;%&#39;) does not exist
    HDU 4287 Intelligent IME(map运用)
    HDU 4925 Apple Tree(推理)
    Linux下使用Fastboot给手机刷ROM
  • 原文地址:https://www.cnblogs.com/chendeqiang/p/12861595.html
Copyright © 2020-2023  润新知