美文网首页
C++ String遍历、查找、替换、插入和删除

C++ String遍历、查找、替换、插入和删除

作者: 编程小兔崽 | 来源:发表于2018-10-19 16:00 被阅读26次

string

string的初始化,在C++中字符串是一种数据类型;

1:string的初始化,遍历,字符串连接。

#include<iostream>

#include<string>

#include<stdio.h>

using namespace std;

int main(void){

//string的初始化,在C++中字符串是一种数据类型;

string s1 = "abcdefghijk";

string s2("abcdefghijk");

string s3(s2);

string s4 = s1;  //调用拷贝构造函数;

string s5(10, 'a');//10个空间中的字符都是'a';

s5 = s1;

cout<<"s3:"<<s3<<endl;

cout<<"s5:"<<s5<<endl;

//string的遍历,重载了[]操作符;

//1、数组方式遍历[]

for(int i = 0; i < s1.length(); i++){

cout<<s1[i]<<" ";  //出现错误(下标越界),不会向外面剖出异常,引起程序的中断;

}

cout<<endl;

//2、迭代器

string::iterator it;

for(it = s1.begin(); it != s1.end(); it++){

cout<<*it<<" ";

}

cout<<endl;

//3、函数at()遍历

for(int i = 0; i < s1.length(); i++){

cout<<s1.at(i)<<" "; //会剖出异常,合理的解决下标越界;

}

cout<<endl;

//字符指针和string的转换

//此时,把s1====>char * 把内存首地址给露出来;

printf("s1:%s \n", s1.c_str());

//s1中的内容拷贝到buf中;

char buf[123] = {0};

s1.copy(buf, 2, 0);//n, pos;下标从0开始拷贝2个字符到buf中,不会是C风格的,注意自己加上0结束标志;

cout<<buf<<endl;

//string子符串的连接

s1 = s1 + s2; //直接+就表:字符串的连接;

s1 += s2; //+=也是字符串的连接;

s1.append(s4); //调用方法append()也是字符串的连接;

cout<<s1<<endl;

return 0;

}

运行结果

 2:string的查找,替换

#include<iostream>

#include<string>

#include<string.h>

using namespace std;

int main(void){

//字符串的查找和替换

    string s1 = "wbm hello wbm 111 wbm 222 wbm 333";

    //1、第一次出现wbm的下标

    int index = s1.find("wbm", 0); 

    cout<<"index :"<<index<<endl;

    //2、求wbm每一次出现的数组下标

/*  int offindex = s1.find("wbm", 0);

    while(offindex != -1){

        cout<<"offindex :"<<offindex<<endl;

        offindex += strlen("wbm");

        offindex = s1.find("wbm", offindex);

    }*/

    //3、把小写wbm换成大写

    int offindex = s1.find("wbm", 0); 

    while(offindex != -1){

        cout<<"offindex :"<<offindex<<endl;

        s1.replace(offindex, strlen("wbm"), "WBM"); //从下标offindex开始,删除n个字符,替换为后面的字符;

        offindex += strlen("wbm");

        offindex = s1.find("wbm", offindex);

    }

    cout<<"s1:"<<s1<<endl;

    string s3 = "aaa bbb ccc";

    s3.replace(0, 3, "AAA");  //替换的函数;

    cout<<"s3:"<<s3<<endl;

    return 0;

}

运行结果:

3:区间的删除和插入

#include<iostream>

#include<string>

#include<algorithm>

using namespace std;

int main(void){

//区间删除和插入

    string s1 = "hello1 hello2 hell03";

    string::iterator it = find(s1.begin(), s1.end(), 'l');

    if(it != s1.end()){

        s1.erase(it); //删除算法;

    }   

    cout<<"s1 :"<<s1<<endl;

    s1.erase(s1.begin(), s1.end()); //删除从pos开始的n个字符;

    cout<<"s1全部删除:"<<s1<<endl;

    cout<<"s1的长度:"<<s1.length()<<endl;

    string s2 = "BBB";

    s2.insert(0, "AAA");  //头插法

    s2.insert(s2.length(), "CCC");//尾插法

    cout<<s2<<endl;

    return 0;

}

运行结果:

4:string的大小写转换-->函数指针

#include<iostream>

#include<string>

#include<algorithm>

using namespace std;

int main(void){

    string s1 = "AAAbbb";

    transform(s1.begin(), s1.end(), s1.begin(), 0, toupper);//toupper可以是:函数的入口地址,函数对象,

    cout<<s1<<endl;

    string s2 = "AAAbbb";

    transform(s2.begin(), s2.end(), s2.begin(), 0, tolower);

    cout<<s2<<endl;

    return 0;

}

array和string的运算符重载

string类

#include<iostream>

#include<stdio.h>

#include<string.h>

using namespace std;

class MyString{

    public:

        friend ostream& operator<<(ostream &out, const MyString &s1);

        friend istream& operator>>(istream &in, MyString &s2);

        MyString(int len = 0){ //默认参数看我们是否自己开辟大小的空间;

            if(len != 0){ 

                m_len = len;

                m_p = new char[m_len+1];

                memset(m_p, 0, m_len);

            }else{

                m_len = 0;

                m_p = new char[m_len+1];    

                strcpy(m_p, "");

            }   

        }   

        MyString(const char *p){

            if(p == NULL){

                m_len = 0;

                m_p = new char[m_len+1];    

                strcpy(m_p, "");

            }else{

                m_len = strlen(p);

                m_p = new char[m_len+1];

                strcpy(m_p, p);

            }

        }

        MyString(const MyString &s){

            m_len = s.m_len;

            m_p = new char[m_len+1];

            strcpy(m_p, s.m_p);

        }

        MyString& operator=(const MyString &t){

            if(m_p){

                delete []m_p;

                m_p = NULL;

                m_len = 0;

            }

            m_len = t.m_len;

            m_p = new char[m_len+1];

            strcpy(m_p, t.m_p);

            return *this;

        }

        ~MyString(){

            if(m_p) {

                delete []m_p;         

                m_p = NULL;

                m_len = 0;

            }

        }

    public:

        MyString operator=(const char *p){

            if(m_p){

                delete []m_p;

                m_p = NULL;

                m_len = 0;

            }

            if(p == NULL){

                m_len = 0;

                m_p = new char[m_len+1];

                strcpy(m_p, "");

            }else{

                m_len = strlen(p);

                m_p = new char[m_len+1];

                strcpy(m_p, p);

            }

            return *this;

        }

        char& operator[](int index){

            return m_p[index];

        }     

        bool operator==(const char *p)const{  //判断与字符串是否相等,看长度和里面的内容是否相等!!!

            if(p == NULL){

                if(m_len == 0){

                    return true;

                }else{

                    return false;

                }

            }else{

                if(m_len == strlen(p)){

                    return !strcmp(m_p, p);

                }else{

                    return false;

                }

            }

        }

        bool operator==(const MyString &s)const{

            if(m_len != s.m_len){

                return false;

            }

            return !strcmp(m_p, s.m_p);

        }

        bool operator!=(const char *p)const{

            return !(*this == p);

        }   

        bool operator!=(const MyString &s)const{

            return !(*this == s);

        }

        int operator<(const char *p)const{

            return strcmp(m_p, p);

        }

        int operator<(const MyString &s)const{

            return strcmp(m_p, s.m_p);

        }

        int operator>(const char *p)const{

            return strcmp(p, m_p);

        }

        int operator>(const MyString &s)const{

            return strcmp(s.m_p, m_p);

        }

        //怎么样把类的指针露出来.

    public:

        char *c_str(){     

            return m_p;

        }

        const char *c_str2(){

            return m_p;

        }

        int length(){

            return m_len;

        }

    private:

        int m_len;

        char *m_p;

};

ostream& operator<<(ostream &out, const MyString &s1){

    out<<s1.m_p;

    return out;

}

istream& operator>>(istream &in, MyString &s2){

    in>>s2.m_p;

    return in;

}

int main(void){    

    MyString s1;

    MyString s2("s2");

    MyString s3 = s2;

    MyString s4 = "s444444444444";

    s4 = "s22222222222";

    s4 = s2;

    s4[1] = '3';

    printf("%c\n", s4[1]); //测试[]改变值了吗?

    cout<<s4<<endl;

    if(s2 == "s2"){

        cout<<"相等"<<endl;

    }else{

        cout<<"不相等"<<endl;

    }

    s3 = "aaa";

    int flag = (s3 < "bbb");

    if(flag < 0){

        cout<<"s3小于bbb"<<endl;  

    }else{

        cout<<"s3大于bbb"<<endl;

    }

    s3 = "adasf";

    strcpy(s3.c_str(), "sga");

    cout<<s3<<endl;

    MyString s9(100);//默认输入要开辟字符串的空间大小;

    cout<<"请输入一个数字 :";

    cin>>s9;

    cout<<s9<<endl;

    return 0;

}

运行结果

array类

#include<iostream>

using namespace std;

class Array{

    public:

        Array(int count);

        Array(const Array &t);

        ~Array();

    public:

        void setData(int i, int data);

        int getData(int i);

        int length();

    private:

        int len;

        int *p;

};

Array::Array(int count){

    len = count;

    p = new int[len];

}

//有指针,的进行深拷贝;

Array::Array(const Array &t){

    len = t.len;

    p = new int[len];

    for(int i = 0; i < t.len; i++){

        p[i] = t.p[i];

    }

}

Array::~Array(){

    if(p){

        delete []p;

        p = NULL;

    }

}

void Array::setData(int i, int data){

    p[i] = data;

}

int Array::getData(int i){

    return p[i];

}

int Array::length(){

    return len;

}

int main(void){

    Array array(10);

    int i;

    for(i = 0; i < array.length(); i++){     

        array.setData(i, i);

    }

    for(i = 0; i < array.length(); i++){

        cout<<array.getData(i)<<" ";

    }

    cout<<endl;

    Array array1 = array;

    for(i = 0; i < array1.length(); i++){

        cout<<array1.getData(i)<<" ";

    }

    cout<<endl;

    return 0;

}

运行结果

如果喜欢请关注    编程小兔崽公众号

相关文章

  • C++ String遍历、查找、替换、插入和删除

    string string的初始化,在C++中字符串是一种数据类型; 1:string的初始化,遍历,字符串连接。...

  • jQuery中的DOM节点操作

    查找节点(略) 创建节点 插入节点 包裹节点 删除节点 复制节点 替换节点 节点遍历(略) 操作dom节点属性 ...

  • 原生JS对Dom的操作汇总

    查找 创建 插入节点 复制节点 删除节点 查找节点 替换节点

  • Java集合类之HashMap源码学习笔记

    数组虽然可以随机访问,但插入和删除效率较低,链表虽然插入和删除效率较高,查找却只能通过遍历,而HashMap则基于...

  • Swift | 数组之遍历、查找、插入、删除、替换

    Date:2016年7 月9日 主要内容 注:因为排版问题#代表空格 数组的遍历,两种建立数组的方法 for x ...

  • 数据结构【单链表基本操作】

    包含单链表的创建、遍历、反转(指针替换、递归)、排序、插入、删除

  • Swift笔记

    String和Data转换 字符串转Data Data转String Swift字符串的插入, 删除, 替换 Sw...

  • C++ 容器

    string 容器 字符串查找和替换 字符串比较 字符串存取 字符串插入删除 子串 简而言之就是字符串截取 vec...

  • splice 用法

    splice 的功能: 删除元素/ 插入元素/ 替换元素 删除元素的用法: 替换元素 插入元素, 和替换元素的差别...

  • vim 总结

    vim 总结: 光标快速移动 插入 缩进 删除 查找与替换 多行查找替换 选中 复制粘贴 其他 自定义快捷键

网友评论

      本文标题:C++ String遍历、查找、替换、插入和删除

      本文链接:https://www.haomeiwen.com/subject/jotuzftx.html