Android NDK开发之旅27--C++--string类的用法总结

Android NDK开发之旅 目录

1.string类-初始化

#include <iostream>
//cout输出 str 引用sstream  Android里可以省略此引用  使用#include <android/log.h>
#include <sstream>
using namespace std;
void main() {

    //方式一
    string str1 = "aaaa";
    cout << "str1:"<< str1 << endl;

    //方式二
    string str21 = string("bbbba");
    string str22("bbbbb");
    cout << "str21:" << str21 << endl;
    cout << "str21:" << str22 << endl;

    //方式三
    string str = "ccccc";
    string str3 = str;
    cout << "str3:" << str3 << endl;

    //方式四
    string str40 = "ddddd";
    string str4(str40);
    cout << "str4:" << str4 << endl;

    //方式五:连续拼接6个'e'
    string str5(6, 'e');
    cout << "str5:" << str5 << endl;

    //方式六:指针方式
    string* str6 = new string("fffff");
    cout << "str6:" << *str6 << endl;
    //方式七:设置为NULL
    //在C++中string是一个类,底层实现也是C语言中的char*
    string*  str7 = NULL; //注意string  str7 = NULL 报错; 

    getchar();
}

执行输出:

str1:aaaa
str21:bbbba
str21:bbbbb
str3:ccccc
str4:ddddd
str5:eeeeee
str6:fffff

2.string类-遍历

#include <exception>  
#include <iostream>
//cout输出 str 引用sstream  Android里可以省略此引用  使用#include <android/log.h>
#include <sstream>
using namespace std;


void main() {
    string str = "Android";
    cout << "数组遍历方式" << endl;
    //方式一:数组遍历(在AS中越界不会报错,内部做了处理)
    for (int i = 0; i < str.length() ; ++i) {
        //内部做了处理,如果下标越界,那么返回空'\0'
        char c = str[i];
    
        cout << "第" << i << "值:" << c << endl;
    }
    cout << endl << "迭代器方式"  << endl;

    //方式二:迭代器
    int i = 0;
    for (string::iterator it = str.begin(); it != str.end(); it++) {
        char c = *it;
        cout << "第" << i << "值:" << c << endl;
        i++;
    }
    cout << endl << "at函数遍历方式" << endl;
    //方式三:at函数遍历(越界,抛异常)
    //在Java中charAt(i),C++中at(i)
    //捕获异常:兼容Android NDK做一些配置
    //在Android NDK开发中r5之前默认不支持C++中的try catch
    //但是在Android NDK R5开始支持C++中的try catch
    //但是Android NDK编译器默认异常控制特效关闭状态,所以手动的打开异常控制
    //打开配置:我们需要在gradle配置文件中配置(cppFlags = "-fexceptions")即可
    try {
        for (int i = 0; i < str.length() + 3; ++i) {
            char c = str.at(i);
            cout << "第" << i << "值:" << c << endl ;
        }
    }
    catch (...) {
        cout << "发生了异常......" << endl;

    }
    getchar();

}

执行输出:

数组遍历方式
第0值:A
第1值:n
第2值:d
第3值:r
第4值:o
第5值:i
第6值:d

迭代器方式
第0值:A
第1值:n
第2值:d
第3值:r
第4值:o
第5值:i
第6值:d

at函数遍历方式
第0值:A
第1值:n
第2值:d
第3值:r
第4值:o
第5值:i
第6值:d
发生了异常......

3.string类和char之间的转换

#include <exception>  
#include <iostream>
//cout输出 str 引用sstream  Android里可以省略此引用  使用#include <android/log.h>
#include <sstream>
using namespace std;

void main() {
    //3.1 string转成char*
    string str = "Android";
    const char* crr1 = str.c_str();

    cout << crr1 << endl;
    //3.2 string转成char[]数组
    char crr2[20] = { 0 };
    //第一个参数:拷贝目标
    //第二个参数:拷贝的数量
    //第三个参数:从哪里开始
    str.copy(crr2, str.length(), 0);
    cout << crr2 << endl;
}

执行输出:

Android
Android

4.string类-字符串查找

#include <iostream>
//cout输出 str 引用sstream  Android里可以省略此引用  使用#include <android/log.h>
#include <sstream>
using namespace std;
void main() {


    string str = "Android Developer love Android";

    cout << "查找从指定位置开始的字符串起始位置" << endl;
    //4.1 查找指定的字符串:find(顺时针)
     //参数一:查找条件
     //参数二:从那个位置开始查找,默认是0开始
    int index = str.find("Android", 0);
    cout << "值:" << index << endl;

    //未找到返回-1
    int index1 = str.find("IOS", 0);
    cout << "值:" << index1 << endl;

    cout << endl << "查找从末尾指定位置开始的字符串末尾位置" << endl;
    //4.2 查找最后一个字符串:find_last_of(逆时针)

    int index2 = str.find_last_of("Android", str.length());


    cout << "值:" << index2 << endl;

    cout << endl << "查找某个字符串出现的次数" << endl;
    //4.3 查找某个字符串出现的次数
    int index3 = str.find("Android", 0);
    //计数
    int count = 0;
    //string::npos默认值是:-1
    //判断是否存在
    while (index3 != string::npos) {
        count++;
        index3 = index3 + 5;
        index3 = str.find("Android", index3);
    }
    cout << "次数:" << count << endl;
    getchar();
}

执行输出:

查找从指定位置开始的字符串起始位置
值:0
值:-1

查找从末尾指定位置开始的字符串末尾位置
值:29

查找某个字符串出现的次数
次数:2

5.string类-字符串替换

#include <iostream>
#include <sstream>
using namespace std;
void main() {
    //5.1 替换一个
        string str0 = "Android Developer love Android";
        str0.replace(0,3,"Hello");
        cout << str0.c_str() << endl;

        string str1 = "Android Developer love Android";
        str1.replace(0, 7, "Hello");
        cout  << str1 << endl;

    //5.2 替换所有
    string str = "Android Developer love Android";
    int index = str.find("Android", 0);
    while (index != string::npos) {
        str.replace(index, 7, "Hello");
        index = index + 7;
        //继续往后查询
        index = str.find("Android", index);
    }
    cout  << str.c_str() << endl;

    getchar();
}

执行输出:

Helloroid Developer love Android
Hello Developer love Android
Hello Developer love Hello

6.string类-字符串删除

#include <iostream>
#include <sstream>
using namespace std;
void main() {

    //6.1 删除单个erase函数
    string str = "Android Developer love Android";
    //可以erase(0)代表删除整个字符串,因为删除数量number默认是字符串的长度
    //erase()也是干掉
    //参数有默认值
    //str.erase();
    //正确写法
    string::iterator index0 = find(str.begin(), str.end(), 'A');
    str.erase(index0);
    cout << str.c_str() << endl;

    //6.2 删除多个
    string str1 = "Android Developer love Android";
    //只一个指针
    string::iterator index = find(str1.begin(), str1.end(), 'A');
    str1.erase(index);
    while (index != str1.end()) {
        if (*index == 'A') {
            str1.erase(index);
        }
        //指针位移
        index++;
    }

    cout << str1.c_str() << endl;
    getchar();
}

执行输出:

ndroid Developer love Android
ndroid Developer love ndroid

7.string类-字符串插入

#include <iostream>
using namespace std;
void main() {
    //从头开始插入
    string str1 = "love Android";
    str1.insert(0, "I ");
    cout << str1.c_str() << endl;

    //从最后开始插入
    string str = "Android Developer love";
    str.insert(str.length(), " Android");
    cout << str.c_str() << endl;
    getchar();
}

执行输出:

I love Android
Android Developer love Android

8.string类-大小写转换

#include <iostream>;
#include <algorithm>  
using namespace std;
void main() {
    //8.1 转小写
    string str = "Android Developer love Android";
    //参数一:从那一个位置开始
    //参数二:到那一个位置结束
    //参数三:目标对象
    //参数四:格式(大写、小写)
    //注意:参数四加'::'
    //因为:在全局命名空间中这个tolower不是宏定义,
    //     而是一个具体有实现的函数,所以需要明确命名空间
    //在不同编译环境下有差别
    //例如:在VS 中不需要"::",但是在Android NDK环境下需要加"::"
    transform(str.begin(), str.end(), str.begin(), ::tolower);


    cout << str.c_str() << endl;
    //8.2 转大写
    string str1 = "Android Developer love Android";
    transform(str1.begin(), str1.end(), str1.begin(), ::toupper);

    cout << str1.c_str() << endl;
    getchar();
}

执行输出:

android developer love android
ANDROID DEVELOPER LOVE ANDROID

特别感谢:

Dream

推荐阅读更多精彩内容