strig的常用操作

包含头文件< string >
string类是一个模板类,位于名字空间std中,通常为方便使用还需要增加:
using namespace std;

初始化

    string str;                      //定义了一个空字符串str
    string str = "Hello world";      // 定义并初始化为为"Hello world
    string s1(str);                  //调用复制构造函数生成s1,s1为str的复制品
    string s2(str,6);                //将str内,始于下标6至结束的部分当作s2的初值
    string s3(str,6,3);              //将str内,始于6且长度顶多为3的部分作为s3的初值
    char cstr[] = "abcde";           //定义了一个C字符串
    string s4(cstr);                 //将cstr字符串作为s4的初值
    string s5(cstr,3);            //将cstr字符串前3个字符作为字符串s5的初值。
    string s6(5,'A');             //生成一个字符串,初始化为5个'A'字符
    string s7(str.begin(),str.begin()+5);     //区间str.begin()和str.begin()+5内的字符作为初值(左开右闭)

输出s1-s7结果为:
Hello world
world
wor
abcde
abc
AAAAA
Hello

string的比较等操作

可以用 ==、>、<、>=、<=、和!=来比较字符串,比较的流程为每次取一个字符比较,直到某个字符串结束,可以用+或者+=操作符连接两个字符串,并且可以用[]获取特定的字符。

string str1("abc123");
string str2("abc12");
string str3("bbc123");
bool torf1 = str1 > str2;
bool torf2 = str1 > str3;

结果分别为true和false

string str1("abc123");
string str2("LCX");
str1 += 'A';
str2 = str2 + str1;
str3 = str2 + "hello"

结果分别为"abc123A"、"LCXabc123"和“”LCXhello“”

string的特征获取

int size();        //返回当前字符串的个数
int length();       //返回当前字符串的个数
bool empty();        //当前字符串是否为空,空则返回1
void resize(int len,char c);  //把字符串当前大小置为len,多去少补,多出的字符c填充不足的部分

其中size()与length()作用一样

string的查找

由于查找是使用最为频繁的功能之一,string提供了非常丰富的查找函数:(注:string::npos)

       s.find(s1)         查找s中第一次出现s1的位置,并返回(包括0)
       s.rfind(s1)        查找s中最后次出现s1的位置,并返回(包括0)
       s.find_first_of(s1)       查找在s1中任意一个字符在s中第一次出现的位置,并返回(包括0)
       s.find_last_of(s1)        查找在s1中任意一个字符在s中最后一次出现的位置,并返回(包括0)
       s.find_first_not_of(s1)         查找s中第一个不属于s1中的字符的位置,并返回(包括0)
       s.find_last_not_of(s1)          查找s中最后一个不属于s1中的字符的位置,并返回(包括0)

注意:查找字符串a是否包含子串b,不是用 strA.find(strB) > 0 而是 strA.find(strB) != string:npos 这是为什么呢?(初学者比较容易犯的一个错误)本部分参考自web100与luhao1993

先看下面的代码

int idx = str.find("abc");
if (idx = =  string::npos);

上述代码中,idx的类型被定义为int,这是错误的,即使定义为 unsigned int 也是错的,它必须定义为 string::size_type。npos 是这样定义的: static const size_type npos = -1; 因为 string::size_type (由字符串配置器 allocator 定义) 描述的是 size,故需为无符号整数型别。因为缺省配置器以型别 size_t 作为 size_type,于是 -1 被转换为无符号整数型别,npos 也就成了该型别的最大无符号值。不过实际数值还是取决于型别 size_type 的实际定义。不幸的是这些最大值都不相同。事实上,(unsigned long)-1 和 (unsigned short)-1 不同(前提是两者型别大小不同)。因此,比较式 idx = = string::npos 中,如果 idx 的值为-1,由于 idx 和字符串string::npos 型别不同,比较结果可能得到 false。因此要想判断 find()等查找函数的结果是否为npos,最好的办法是直接比较。

string的其他函数

string &insert(int p,const string &s);  //在p位置插入字符串s
string &replace(int p, int n,const char *s); //删除从p开始的n个字符,然后在p处插入串s
string &erase(int p, int n);  //删除p开始的n个字符,返回修改后的字符串
string substr(int pos = 0,int n = npos) const;  //返回pos开始的n个字符组成的字符串
void swap(string &s2);    //交换当前字符串与s2的值
void push_back(char c)   //当前字符串尾部加一个字符c
const char *c_str()const;  //返回一个以null终止的c字符串,即c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同,用于string转const char*

测试代码

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string str1 = "abc123defg";
    string str2 = "swap!";
    cout<<str1<<endl;
    cout<<str1.erase(3,3)<<endl;  //从索引3开始的3个字符,即删除掉了"123"
    cout<<str1.insert(0,"123")<<endl; //在头部插入
    cout<<str1.append("123")<<endl;   //append()方法可以添加字符串
    str1.push_back('A');  //push_back()方法只能添加一个字符
    cout<<str1<<endl;
    cout<<str1.replace(0,3,"hello")<<endl; //即将索引0开始的3个字符替换成"hello"
    cout<<str1.substr(5,7)<<endl; //从索引5开始7个字节
    str1.swap(str2);
    cout<<str1<<endl;
    const char* p = str.c_str();
    printf("%s\n",p);
    return 0;
}

程序执行结果为:
abc123defg
abcdefg
123abcdefg
123abcdefg123
123abcdefg123A
helloabcdefg123A
abcdefg
swap!
swap!

详细请参考DO_Better的博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值