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;
}

這裏寫圖片描述

剛學會添加圖片的我展示了一波操作,希望對各位親們有幫助啊!!!有任何不懂,是意見或是建議,歡迎留言!!!

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