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\n",ans);  
    printf("%s\n", 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\n", 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

posted @ 2020-05-12 07:17  多弗朗强哥  阅读(189)  评论(0编辑  收藏  举报