STL—字符串

头文件: #include <string>

一、string对象的定义:

string s1;            //构造字符串s1
string s2(s1);        //把字符串s1值赋给字符串s2
string s1("wuyang");  //构造字符串s1,且s1为wuyang

这里写图片描述

string s1(n,'w');     //构造字符串s1,且s1为n个w

这里写图片描述

cin >> s1;            //输入字符串s1,但是不读入空格和换行

这里写图片描述

getline(cin,s1);      //输入字符串s1,读入空格但是不读入换行

这里写图片描述

getline(cin,s1,'w');  //输入字符串s1,读入空格和换行,直到遇到w

这里写图片描述

二、string的一些操作

s1.empty();              //判断s1为是否为空 为空返回真,否则返回假
s1.size();                   //求字符串s1的长度
//注意:s1.size()返回的值并不是int类型
s1.length();                 //求字符串s1长度
s1[n];                       //代表字符串s1中第n+1位的字符
s1.append("abc");            //在字符串尾部添加字符串

这里写图片描述

s1+s2;                       //将s2连接到s1后面(连接了s1,s2)
//注意:s1+'w'+'y'这种相加是允许的。但是'w'+'y'+s1是错误的

这里写图片描述

s1=s2;                       //把s2的值赋给s1
s1==s2;                      //判断s1,s2是否相等,相等为真
来展示一段代码帮助理解:
int main()
{
    string s1("123");
    cout << "字符串s1初始值为: " << s1 << endl;
    string s2("456");
    s1.append("abc");
    cout << "字符串s1为: " << s1 << endl;
    cout << "s1+s2结果为" << s1+s2 << endl ;
    while(!s1.empty())
    {
        string::size_type i; //这里i要定义成size_type类型
        for(i=0; i!=s1.size();i++) //s1.size()表示s1的字符长度
        {
            cout<<s1[i];
        }
        cout<<endl;
        break;
    }
    return 0;
}

这里写图片描述

三、对string中字符的处理:

    isalnum(c); //字符c如果是字母或数字,返回真
    isdigit(c); //字符c如果是数字,返回真
    isxdigit(c);//字符c是十六进制数,返回真
    isalpha(c); //字符c如果是字母,返回真
    islower(c); //字符c如果是小写字母,返回真
    isupper(c); //字符c如果是大写字母,返回真
    tolower(c); //字符c是大写字母,返回其小写,否则返回c
    toupper(c); //字符c是小写字母,返回其大写,否则返回c
    isgraph(c); //字符c是可打印字符(不可是空格),返回真
    isprint(c); //字符c是可打印字符(可以是空格),返回真
    iscntrl(c); //字符c是控制符,返回真
    ispunct(c); //字符c是标点符,返回真
    isspace(c); //字符c是空格符,返回真
下面展示一段代码
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int main()
{
    string s1("123abc. >@");
    cout << "字符串s1为:  " << s1 << endl << endl;
    string::size_type i;
    for(i=0;i<s1.size();i++)
    {
        if(isgraph(s1[i]))
            cout << s1[i] << " ";
        if(isdigit(s1[i]))
            cout << "数字 " << endl;
        if(isalpha(s1[i]))
        {
            cout << "字母" ;
            if(islower(s1[i]))
                cout << "(小写字母)" << endl;
            if(isupper(s1[i]))
                cout << "(大写字母) " << endl;
        }
        if(ispunct(s1[i]))
            cout << "标点符 " << endl;
        if(isspace(s1[i]))
            cout << "  空格符" << endl;
    }
    return 0;
}

运行结果是

四、string与数值的相互转换

头文件: #include <sstream>

C++引入了ostringstream、istringstream、stringstream这三个类,要使用他们创建对象就必须包含sstream.h头文件。

 istringstream //用于执行C++风格的串流的输入操作。 
 ostringstream //用于执行C风格的串流的输出操作。 
 stringstream  //同时可以支持C风格的串流的输入输出操作。
代码:

方法一 这是C的方法 用到了sprintf

#include <iostream>
#include <string>
#include <cstdio>
using namespace std;

int main()
{
    char b[10];
    string a;
    sprintf(b,"%d",1975);  //数值转化为string
    a=b;
    cout<<a;
}

这里写图片描述

方法二 用到#include <sstream>

// 数字转换成字符
#include <iostream>
#include <string>
#include <cstdio>
#include <sstream>
using namespace std;

int main()
{
    double x;
    x=1975;
    ostringstream o;
    o<<x;
    cout << o.str();
    return 0;
}
//字符转换成数字
#include <iostream>
#include <string>
#include <cstdio>
#include <sstream>
using namespace std;

int main()
{
    string s1("7569");
    double x;
    x=1975;
    istringstream o(s1);
    o>>x;
    cout << x;
    return 0;
}

五、字符的插入,删除,替换,查找

首先要作如下操作
string s1="abc123def";
string::iterator it; //定义迭代器

1.插入

    it=s1.begin(); //表示迭代器的位置(这里是s1的第一个元素)
    s1.insert(it+1,'s'); //迭代器所在位置后一位上的元素前插入‘s’
    cout << s1 << endl; 

2.删除

    it=s1.begin();  //表示迭代器的位置(这里是s1的第一个元素)
    s1.erase(it+1); //表示删除迭代器位置后一位上的元素
    //s1.erase(it,it+1); //表示删除it到it+1间的元素
    cout << s1 << endl;

3.替换s1.replace(pos,num,char* a);

pos 代表下标,num代表元素个数,char* a代表要替换成的元素

    string s1="abc1234..<<@@";
    s1.replace(3,4,"good"); //从下标3开始连续四个元素替换为good
    cout<<s1<<endl;
来变一段代码帮助理解以上三个操作
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;

int main()
{
    string s1="abc1234..<<@@";
    s1.replace(pos,num,char* c);
    string::iterator it;    //定义一迭代器
    s1.replace(3,4,"good"); //从下标3开始连续四个元素替换为good
    cout<<s1<<endl;
    it=s1.begin();        //表示迭代器的位置(这里是s1的第一个元素)
    s1.insert(it+1,'p');  //迭代器所在位置后一位上的元素前插入‘s’
    cout << s1 << endl;
    it=s1.begin();        //表示迭代器的位置(这里是s1的第一个元素)
    s1.erase(it+1);       //表示删除迭代器所在位置后一位上的元素
    cout << s1 << endl;
    return 0;
}

运行结果

查找

    s1.find('c');       //返回第一个'c'的下标
    s1.find("abc");     //返回第一个"abc"的下标
    s1.find('c',pos);   //从下标pos开始返回第一个'c'的下标
    s1.find("abc",pos); //从下标pos开始返回第一个'abc'的下标
    s1.rfind('c');      //从后往前第一个'c'的下标
    s1.rfind("abc");    //从后往前第一个"abc"的下标
    s1.rfind('c',pos);  //从下标pos开始从后往前第一个'c'的下标
    s1.rfind("abc",pos);//从下标pos开始从后往前第一个"abc"的下标
    s1.find("abc",pos,n);
    //从下标pos开始,返回子串中前n个子串在s1中的位置
    s1.rfind("abc",pos,n);
    //从下标pos开始,从前往后查找,返回子串中前n个子串在s1中的位置
编写一段代码
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;

int main()
{
    string s1="123abc1234..<<@@abc12abc123abc123abc123abc";
    int pos,n;
    cout << "第一个c的下标是:" << s1.find('c') << endl; 
    cout << "第一个abc的下标是: " << s1.find("abc") << endl;
    cout << "从后往前第一个c的下标是:" << s1.rfind('c') << endl;
    cout << "从后往前第一个abc的下标是: " << s1.rfind("abc") << endl;
    cin >> pos ;
    cout << "从下标pos开始第一个'c'的下标是: " << s1.find('c',pos) << endl;
    cout << "从下标pos开始第一个abc的下标是: " << s1.find("abc",pos) << endl;
    cout << "从下标pos开始从后往前第一个c的下标是: " << s1.rfind('c',pos) <<endl;
    cout << "从下标pos开始从后往前第一个abc的下标是: " << s1.rfind("abc",pos) << endl;
    cin >> n;
    cout << "从下标pos开始,子串中前n个子串在s1中的位置是: " <<s1.find("abc",pos,n) << endl;
    cout << "从下标pos开始,从后往前查找,子串中前n个子串在s1中的位置是: " <<s1.rfind("abc",pos,n) << endl;
    return 0;
}

这里写图片描述

刚学会添加图片的我展示了一波操作,希望对各位亲们有帮助啊!!!有任何不懂,是意见或是建议,欢迎留言!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章