C++学习笔记35:String类

1 基本知识

    -- string类是模板类
        typedef basic_string<char> string;
    -- 使用string类要包含头文件<string>
    -- string对象的初始化
        - string s1("Hello");
        - string month = "March";
        - string s2(8,' x');    // s2包含8个‘x’
    -- 错误的初始化方法
        - string error1 = 'c';  // 错误
        - string error2('u');   // 错误
        - string error3 = 22;   // 错误
        - string error4(8);     // 错误
    -- 可以将字符赋值给string对象
        - string s;
        - s = 'n';  // ok
    -- string对象的长度用成员函数length()读取;
        string s("hello");
        cout << s.length() << endl;
    -- string 支持流读取运算符
        - string stringObject;
        - cin >> stringObject;
    -- string 支持getline函数
        - string s;
        - getline(cin, s);

2 string的赋值和连接

    -- 用=赋值
        - string s1("cat"), s2;
        - s2 = s1;
    -- 用assign成员函数复制
        - string s1("cat"), s3;
        - s3.assign(s1);
    -- 用assign成员函数部分复制
        - string s1("catpig"), s3;
        - s3.assign(s1, 1, 3);    // 从s1中下标为1的字符开始复制3个字符
    -- 单个字符复制
        s2[5] = s1[3] = 'a';
    -- 逐个访问string对象中的字符
        string s1("Hello");
        for(int i = 0; i < s1.length(); i++)
            cout << s1.at(i) << endl;
    -- 成员函数at会做范围检查,如果查出范围,会抛出out_of_range异常,而下标运算符不会做范围检查
    -- 用+运算符连接字符串
        string s1("good"), s2(" morning!");
        s1 += s2;
        cout << s1;
    -- 用成员函数append连接字符串
       string s1("good"), s2(" morning!");
       s1.append(s2);
       cout << s1;
       s2.append(s1, 3, s1.size());     // s1.size(), s1字符数
       cout << s2;
       // 下标为3开始,s1.size()个字符,如果字符串内没有足够字符,则复制到字符串最后一个字符。

3 比较string

    -- 用关系运算符比较string的大小
        - ==, >, >=, <, <=, !=
        - 返回值都是bool类型,成立返回true,否则返回false
        - 例如:
            string s1("hello"), s2("hello"), s3("hell");
            bool b = (s1 == s2);
            cout << b << endl;
            b = (s1 == s3);
            cout << b << endl;
            b = (s1 > s3);
            cout << b << endl;
    用成员函数compare比较string的大小
        string s1("hello"), s2("hello"), s3("hello");
        int f1 = s1.compare(s2);    // 输出0  hello == hello
        int f2 = s1.compare(s3);    // 输出1  hello > hell
        int f3 = s3.compare(s1);    // 输出-1 hell < hello
        // s1下标为1开始的两个字符   和   s3下标为0开始的3个字符
        int f4 = s1.compare(1, 2, s3, 0, 3);    //s1 1-2; s3 0-3  输出-1  el < hel
        int f5 = s1.compare(0, s1.size(), s3);  // s1 0-end     输出1     // hello > hel
        cout << f1 << endl << f2 << endl << f3 << endl;
        cout << f4 << endl << f5 << endl;

4 子串

    -- 成员函数substr
        string s1("hello world"), s2;
        s2 = s1.substr(4, 5);   // 下标4开始5个字符
        cout << s2 << endl;

5 交换string

    -- 成员函数swap
        string s1("hello world"), s2("really");
        s1.swap(s2);
        cout << s1 << endl;
        cout << s2 << endl;

6 寻找string中的字符

    -- 成员函数find()
        - string s1("hello world");
        - s1.find("lo");
        - 在s1中从前向后查找,“lo”第一次出现的地方,如果找到,返回 “lo”开始的位置,即l所在的位置下标。如果找不到,返回string::npos(string中定义的静态常量)
    -- 成员函数rfind()
        - string s1("hello world");
        - s1.rfind("lo");
        - 在s1中从后向前查找,“lo”第一次出现的地方,如果找到,返回“lo”开始的位置,即l所在的位置下标。如果找不到,返回string::npos
    -- 成员函数find()
        string s1("hello worlld");
        cout << s1.find("ll", 1) << endl;
        cout << s1.find("ll", 2) << endl;
        cout << s1.find("ll", 3) << endl;
        // 分别从下标1, 2, 3开始查找“ll”  输出 2 2 9
    -- 成员函数find_first_of()
        - string s1("hello world");
        - s1.find_first_of("abcd");
        - 在s1中从前向后查找“abcd”中任何一个字符第一次出现的地方,如果找到,返回找到字符的位置,如果找不到,返回string::npos
    -- 成员函数find_last_of()
        - string s1("hello world");
        - s1.find_last_of("abcd");
        - 在s1中查找”abcd“中任何一个字符最后一次出现的地方,如果找到,返回找到字母的位置,如果找不到,返回string::npos
    -- 成员函数:find_first_not_of  从前往后查找不在”abcd“中的字母第一次出现的地方
    -- 成员函数:find_last_not_of   从后往前查找不在”abcd“中的字母第一次出现的地方

7 删除string中的字符

    -- 成员函数erase()
        string s1("hello world");
        s1.erase(5);    // 去掉下标5以及之后的字符
        cout << s1;
        cout << s1.length();
        cout << s1.size();
        // 输出  hello55

8 替换string中的字符

    -- 成员函数replace()
        string s1("hello world");
        s1.replace(2, 3, "haha");   // 将s1中下标2开始的3个字符换成”haha“   输出  hehaha world
        s1.replace(2, 3, "haha", 1, 2); // 将s1中下标2开始的3个字符换成”haha“中下标1开始的2个字符  输出 heah world
        cout << s1;

9 string中插入字符

    -- 成员函数insert()
        string s1("hello world");
        string s2("show insert");
        s1.insert(5, s2);   // 将s2插入s1下标5的位置
        cout << s1 << endl; // 输出 helloshow insert world
        s1.insert(2, s2, 5, 3); // 将s2中下标5开始的3个字符插入s1下标2的位置
        cout << s1 << endl; // 输出 heinslloshow insert world

10 转换成C语言式char*字符串

    -- 成员函数c_str()
        string s1("hello world");
        printf("%s\n", s1.c_str());
        // s1.c_str()返回传统的const char* 类型字符串,且该字符串以‘\0’结尾
        输出: hello world
    -- 成员函数data()
        string s1("hello world");
        const char* p1 = s1.data();
        for(int i = 0; i < s1.length(); i++)
            printf("%c",*(p1 +i));
        // s1.data()返回一个char*类型的字符串,对s1的修改可能会使得p1出错

11 字符串的流处理

    -- 除了标准流和文件流输入输出外,还可以从string进行输入输出;
    -- 类似istream和ostream进行标准流输入输出,我们用istringstream和ostringstream进行字符串的输入输出,也称为内存输入输出
    #include <string>
    #include <iostream>
    #include <sstream>
    -- 字符串输入流
        string input("Input test 123");
        istringstream inputString(input);
        string s1, s2;
        int i;
        inputString >> s1 >> s2 >> i;
        cout << s1 << endl << s2 << endl << i << endl;

        long L;
        if(inputString >> L)    // 由于inputString流中数据已经读取完毕,因此如果你想要再次读取的话,inputString >> L 表达式返回值就是false
            cout << "long\n";
        else
            cout << "empty\n";
        输出:
        Input
        test
        123
    -- 字符串输出流
        ostringstream outputString;
        int a = 10;
        outputString << "This " << a << "ok" << endl;
        cout << outputString.str();
        // 输出: This 10ok
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值