由浅入深-string

 

由浅入深学string一:基本使用

--1 string定义和初始化

    string s1; //调用默认构造函数,初始化为空

    string s1(s2);

    string s1("hello");

    string s1(n,'a'); //n个a

--2 string读写

    cin>>s1;

    getline(cin,s1);

--3 string对象操作

    s1.empty()   //判断是否为空,为空则返回ture,反之返回false
    s1.size()    //获取字符串大小
    s1[n]        //下表操作,标识每一位的值,n(0,s1.size()-1),返回size_type类型,定义同无符号整型,

                 //下标可作为左值对其进行赋值,不可越界,空字符串不能取值
    s1+s2        //字符串连接
    s1=s2        //s2赋值给s1
    s1==s2       //比较字符串是否相等,相等返回ture     !=,<=,<.>,>=

                 //比较,同长度比较第一个不同的字符,不同长度,短的和长的前面都相同,长的大

--4 string中字符的处理

    //cctype头文件中定义函数
    isalnum(c) //字母或字符,返回ture
    isalpha(c) //字母返回ture
    isdigit(c) //数字
    isxdigit(c)//十六进制
    islower(c) //小写字母
    isupper(c) //大写字母
    tolower(c) //转为小写,已是小写不处理,返回c
    toupper(c) //转为大写
    isprint(c) //可打印字符
    ispunct(c) //标点符号
    isspace(c) //空白字符
    isgraph(c) //不是空格,但可打印
    iscntrl(c) //控制字符返回ture

--5 练习

----1)string读写

void _string()
{
    cout<<"---_string"<<endl;
    string s1;
    cout<<"---prac1-请输入!!"<<endl;
    while(cin>>s1)
        cout<<"s1="<<s1<<endl; 
    //输入( hello world );返回
    //s1=hello
    //s1=world
    //说明:忽略所有开头的空格,一个字符串以空格结束;要想结束输入,windows用ctrl+z;unix一般用ctrl+d

    cout<<"---prac2-请输入!!"<<endl;
    while(getline(cin,s1))
        cout<<"s1="<<s1<<endl;
    //输入( hello world );返回 ( hello world ),,在输入(hi),返回s1=hi,空格也会输出
    //遇到换行输入下一行,结束方式同prac1

}

----2)对象操作

void _string()

{

    //---prac3:读入两个字符串,判断是否相等,不相等则输出大的一个
    cout<<"--请输入两个数!!"<<endl;
    string s1,s2;
    cin>>s1>>s2;
    if(s1==s2)
    {
        cout<<"相等"<<endl;
    }
    else
    {
        cout<<"大的那个是" << (s1>s2?s1:s2)<<endl;
    }

    //--prac4:读入多个,全部输出,相邻的以空格分开
    string s3,s4;
    while(cin>>s3)
    {
        s4+=" " + s3;
    }
    cout<<"所有输入的字符串为"<<s4<<endl;

    //--prac5:去掉string中的标点
    string s5,s6;
    while(getline(cin,s5))
    {
        if(!s5.empty())
        {
            for(int i=0;i!=s5.size();i++)
            {
                if(ispunct(s5[i])) ;
                else s6+=s5[i];
            }
        }
        cout<<"去标点后的值为"<<s6<<endl;
    }
    //输入 hello,world!!,返回helloworld,在输入hi!!,返回helloworldhi

    //--prac6:去掉字符串中的me,扩展去掉任意字符串
    string s7="my name is melly!!",s8;
    for(int i=0;i!=s7.size();i++)
    {
        if(s7[i]=='m'&&s7[i+1]=='e') i++;
        else s8+=s7[i];
    }
    cout<<"my name is melly!! 去除 me后是"<<s8<<endl; //my na is lly!!

}

 

由浅入深学string二:扩展使用

--1 string支持的容器操作

----1)构造函数,使用迭代器标示范围内的副本

     c(b,e);

举例:
    string s10("hello world");
    string::iterator iter1=s10.begin();
    string s11(s10.begin(),s10.end());
    string s12(iter1,iter1+s10.size());
    cout<<s11<<endl;
    cout<<s12<<endl;

----2)容器定义的类型别名

    size_type               //无符号整型,一般用来存储容器的长度
    difference_type         //存储两个迭代器迭代器的差值,可为负数
    iterator                //容器的迭代器类型
    const_iterator          //元素只读迭代器类型
    reverse_iterator        //按逆序寻址的元素迭代器类型
    const_reverse_iterator
    value_type              //元素类型-
    reference               //元素的左值类型
    const_reference         //元素的常量左值类型

----3)begin,end,rbegin,rend成员

    string s10("hello world");

    string::reverse_iterator iter2=s10.rbegin();
    string s13(s10.rbegin(),s10.rend());
    string s14(iter2,iter2+s10.size());
    cout<<s13<<endl;        //dlrod olleh
    cout<<s14<<endl;

---4)添加元素操作

    c.push_back(t)          //最后位插入t元素
    c.insert(p,t)           //p位置插入t元素
    c.insert(p,n,t)         //p位置插入n个t
    c.insert(p,b,e)         //p位置插入迭代器b到e标识的范围

举例:

    s10.push_back('!!');
    cout<<s10<<endl;    //hello world! ,注意只有一个!,插入的是字符元素,输入多个也会截断
    s10.insert(s10.begin(),2,'i');
    cout<<s10<<endl;    //iihello world!

----5)容器大小操作

    c.max_size()            //容器最大可容纳的个数
    c.resize(n)             //调整容器的长度,使得能容纳n个
    c.resize(n,t)           //调整容器的长度,n位都为t元素

举例:

    string s10("hello world");

    cout<<s10.max_size()<<endl; //1073741820
    s10.resize(2);              //初始化当前容纳的数,不改变max_size()
    cout<<s10.max_size()<<endl; //1073741820
    cout<<s10<<endl;            //he
    s10.push_back('!');         //he!
    cout<<s10<<endl;

----6)访问容器内元素的操作
    c.at(n)                 //返回下表n的元素的引用,不能越界

    cout<<s10.at(0)<<endl;  //h

----7)删除元素操作

    c.erase(p)              //删除迭代器p所指向的元素
    c.erase(b,e)            //删除b,e区间的元素
    c.clear()               //全部删除

举例:

    s10="hello,world";
    s10.erase(s10.begin());
    cout<<s10<<endl;        //ello,world
    s10.erase(s10.begin(),s10.begin()+2);
    cout<<s10<<endl;        //lo,world ,做闭合又不闭合,只删除2位
    s10.clear();
    cout<<s10<<endl;        //空

----8)赋值与swap操作
    s1.swap(s2)             //s1和s2的值交换
    s1.assign(b,e)          //重新赋值,迭代器b到e范围间的值
    s1.assign(n,t)          //重新赋值,n个t

    //不同容器(或相同)类型的容器内,元素类型不相同但是互相兼容,就要用assign,不用=号赋值

----9)capacity和reserve成员 (待由浅入深学string)

--2 构造string对象的其他方法

----1)使用指针参数的构造,该指针指向以空字符结束的字符数组

举例:

    char *cp="hiptr";
    char c_array[]="hiarray";
    char no_null[]={'h','i'};
    char have_null[]={'h','i','\0'};
    string s16(cp);
    cout<<s16<<endl;
    s16=c_array;
    cout<<s16<<endl;
    s16=no_null;        //正常运行,打印erro,没结束符
    cout<<s16<<endl;
    s16=have_null;
    cout<<s16<<endl;

----2)使用指针和计数器,注意n,pos,len都是unsigned值

    string s(cp,n)          //指针cp指向数组的前n个
    string s(s1,pos)        //字符串s1.从pos位置到最后,pos不能大于s1.size()
    string s(s1,pos,len)    //字符串s1.从pos位置起len个,len若指定太大只能赋值到s1从pos到最后一位

举例:

    char no_null[]={'h','i','!'};
    string s17(no_null,3);
    cout<<s17<<endl;    //正确,打印hi!
    string s18(s17,0);
    cout<<s18<<endl;    //打印,hi!
    string s19(s17,0,1);
    cout<<s19<<endl;    //打印,hi

 

    char *p9="hi";
    string s9="hello";

    const char *p10=s9.c_str();      //需要c_str转换,转换为const char*类型
    cout<<"s9="<<s9<<endl;
    cout<<sizeof(s9.c_str())<<endl; //4,类型为const char*,32位上指针都为4个字节
    cout<<sizeof(s9[0])<<endl;      //1,类型我字符类型,1个字节

--3 修改string对象的其他方法

    //说明,pos指当前字符串s的位置,n,len为长度,c为元素,cp为指向以null结束的字符串副本

    s.insert(pos,n,c)       //插入n个c元素,从字符串s的pos位置起
    s.insert(pos,s1)
    s.insert(pos,s1,pos,len)
    s.insert(pos,cp,len)
    s.insert(pos,cp)
    s.assign(s1)           //用s1代替s
    s.assign(s1,pos,len)
    s.assign(cp,len)
    s.assign(cp)
    s.erase(pos,len)

举例:

    char *cp="hiptr";

    string s20("hello,test");
    string s21("!?");
    s20.insert(0,2,'a');
    cout<<s20<<endl;                    //aahello,test
    s20.insert(s20.size(),s21,0,1);
    cout<<s20<<endl;                    //aahello,test!
    s20.insert(s20.size(),cp);
    cout<<s20<<endl;                    //aahello,test!hiptr

--4 只适用于string类型的操作

----1)substr,说明pos为s的位置

    s.substr(pos,n)     //返回,从pos起,n个
    s.substr(pos)
    s.substr()          //返回,s

举例:

    s20.assign("hello");
    cout<<s20.substr(0)<<endl;     //hello
    cout<<s20.substr(1,4)<<endl;   //ello
    cout<<s20.substr()<<endl;      //hello

----2)append/replace

    args参数可替换为:
    s1,s1 pos len,cp,cp len,n c,b e
    s.append(args);         //追加
    s.replace(pos,len,args) //替换,args不能为b e
    s.replace(b,e,args)     //替换,args只能为n c,b e

举例:

    s20.assign("hello");

    cout<<s20.append("??")<<endl;           //hello??
    cout<<s20.replace(0,2,s21,0,1)<<endl;   //!llo??替换的没个个数没要要替换的长,亦可

--5 string类型的查找操作

    args参数可替换为,c pos,s pos,cp pos,cp pos n,返回size_type,没有则返回npos
    s.find(args)               //返回第一次查到位置
    s.rfind(args)              //最后一次出现
    s.find_first_of(args)      //第一个在args中任何出现的字符的位置
    s.find_first_no_of(args)   //第一个不属于args的字符位置
    s.find_last_of(args)
    s.find_first_no_of(args)

例如:

    s20.assign("hello hllo");
    cout<<s20.find("he",0)<<endl;           //0
    cout<<s20.find("el",2)<<endl;           //米有
    cout<<s20.find_first_of("lh",0)<<endl;  //0

    cout<<"firstof"<<s20.find_first_of(" t",0)<<endl;  //5,空格也算

--6 string对象的比较

    //说明,s1>s2,返回值>0,反之<0,相等则==0;注意s2要是指定位置,则长度不可缺少
    s1.compare(s2)
    s1.compare(pos,len,s2)
    s1.compare(pos,len,s2,pos,len)
    s1.compare(cp)
    s1.compare(pos,len,cp)
    s1.compare(pos,len,cp,n)

举例:

    s20.assign("hello");
    string s22("hi hey");
    cout<<s20.compare(0,2,s22,3,2)<<endl;   //0

--7 练习

----1)从某字符串中去掉任意一个字符串,如从字符串abcdetfghetijk中去掉et

    int flag=0,i=0;
    while(flag!=1)
    {
        cout<<"--in"<<endl;
        if(!s24.empty() && s23.find(s24)!=string::npos) s23.erase(s23.find(s24),s24.size());
        else flag=1;
    }
    if(i==0) cout<<s23<<"中没有"<<s24<<endl;
    else cout<<"去了et处理后abcdetfghetijk等于"<<s23<<endl; //abcdfghijk

    //要进行s24.empty()判断,否会进入死循环;

----2)从某字符串中找到某字符,并用另一个字符替换;如找到hi用hello替换

    int flag=0,i=0;
    while(flag!=1)
    {
        cout<<"--in"<<endl;
        cout<<s24.empty()<<endl;
        if(!s24.empty()&&s23.find(s24)!=string::npos)
        {
            s23.replace(s23.find(s24),s24.size(),"qq");
            i++;
        }
        else flag=1;
    }
    if(i==0) cout<<s23<<"中没有"<<s24<<endl;
    else cout<<"abcdetfghetijk中et用qq代替后为"<<s23<<endl; //abcdqqfghqqijk   

 

----3)查找字符串中所有数字字符,所有字母字符,用find_first_of 和 find_first_not_of,如a1b2c3def

    string s26("abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ");
    string s27("0123456789");
    string s28("a1b2c3def");
    string::size_type j=0,k=0,pos=0;

    while((pos=s28.find_first_of(s26,pos))!=string::npos)
    {
        pos++;
        j++;
    }
    pos=0;
    while((pos=s28.find_first_of(s27,pos))!=string::npos)
    {
        pos++;
        k++;
    }
    cout<<"字母个数为"<<j<<endl;
    cout<<"数字个数为"<<k<<endl;

----4)字符串以单词为单位倒序输出,

    如"i am a beautiful girl,my name is lily!",返回"lily! is name my girl, beautiful a am i"

    string s30("i am a beautiful girl, my name is lily!");
    string s31;
    int wlen=0;
    for(int i=s30.size()-1; i>=0 ; i--)
    {
        string temp;
        if(s30[i] == ' ' || i==0)
        {
            temp=s30.substr(i,wlen+1);
            wlen=0;
        }
        else  wlen++;

        if(i==0) s31=s31+" "+temp;
        else s31=s31+temp;
    }
    cout<<"倒叙后i am a beautiful girl,my name is lily!为"<<s31<<endl;

    // lily! is name my girl, beautiful a am i

 

(2011-10-26 11:17:16)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值