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