欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

C++中string的常见操作技巧

最编程 2024-01-12 21:58:48
...

构造string

int main()
{
    string str1("hello");
    cout << str1 << endl;//hello
    string str2("hello",2);//指定字符串的前2个字符
    cout << str2 << endl;//he
    string str3(str1, 2);//从下标2开始的字符的拷贝
    cout << str3 << endl;//llo
    string str4(str1, 2,2);//从下标2开始的2个字符的拷贝
    cout << str4 << endl;//ll
    string str5(5,'a');//5个字符a
    cout << str5 << endl;//aaaaa
    system("pause");
}

访问string

虽然at和operator[]都可以获取指定下标的字符,但at有越界检查,发现越界时(pos >= size())会抛出异常std::out_of_range ,operator[]没有越界检查,当越界时行为未定义。

int main()
{
    string str1("hello");
    cout << str1.front() << endl;//获取string的首字符,h
    cout << str1.back() << endl;//获取string的尾字符,o
    cout << str1[1] << endl;//获取下标为1的字符,e
    cout << str1.at(2) << endl;//获取下标为2的字符,l
    cout << str1.data() << endl;//返回指向字符串首字符的指针,C++11前不一定是以空字符终止的,C++11后是空字符终止的
    cout << str1.c_str() << endl;//返回指向字符串首字符的指针(空字符终止的)
    cout << str1.substr(1,2) << endl;//返回从下标1开始的2个字符,el,参数1默认值为0,参数2默认值为size()-第一个参数值
    cout << str1.substr() << endl;//hello
    cout << str1.substr(3) << endl;//lo
    cout << str1.size()<< endl;//5,size()和length()无区别,都返回字符数量
    cout << str1.length() << endl;//5
    cout << boolalpha << str1.empty() << endl;//判断字符串是否为空
    system("pause");
}

操作string

int main()
{
    string str1("hello");
    string str2(" world");
    auto str3 = str1 + str2;//连接两个string,hello world
    auto str4 = str1 + " xiao ming";//连接string和字符指针,hello xiao ming
    str3.assign("12345678");//赋值为12345678
    str3.clear();//清空所有字符
    str3.append("222");//追加字符串
    str3.insert(1, "abc",3);
    cout << str3<<endl;//2abc22
    str3.replace(1, 3,"defg");
    cout << str3 << endl;//2defg22
    str3.erase(1, 4);
    cout << str3 << endl;//222
    system("pause");
}

assign替换string的所有内容,然后返回string的引用,append将新字符追加到string的末尾,然后返回string的引用,这两个函数多个重载版本,它们的参数可以是以下形式:

参数 说明
str 字符串str
str,pos,len str中从pos开始最多len个字符
cp,len 从cp指向的字符数组最多len个字符
cp cp指向的以空字符结尾的字符数组
n,c n个字符c
b,e 迭代器b和e指定的范围内的字符
初始化列表 花括号包围的,以逗号分隔的字符列表

replace将string指定范围内的字符替换为其它字符,然后返回string的引用,当replace的前两个参数为pos,len的时候,后面的参数可以是下面的形式:

参数 说明
str 字符串str
str,pos,len str中从pos开始最多len个字符
cp,len 从cp指向的字符数组最多len个字符
cp cp指向的以空字符结尾的字符数组
n,c n个字符c

当replace的前两个参数为迭代器范围时,后面的参数可以是下面的形式:

参数 说明
str 字符串str
cp,len 从cp指向的字符数组最多len个字符
cp cp指向的以空字符结尾的字符数组
n,c n个字符c
b,e 迭代器b和e指定的范围内的字符
初始化列表 花括号包围的,以逗号分隔的字符列表

insert在pos之前插入指定的字符,当pos是下标时返回string的引用,pos是迭代器时返回第一个插入字符的迭代器。
当pos是下标时参数形式可以是:

参数 说明
str 字符串str
str,pos,len str中从pos开始最多len个字符
cp,len 从cp指向的字符数组最多len个字符
n,c n个字符c

当pos是迭代器时参数形式可以是:

参数 说明
n,c n个字符c
b,e 迭代器b和e指定的范围内的字符
初始化列表 花括号包围的,以逗号分隔的字符列表
int main()
{
    string str1 = "123456";
    auto iter=str1.insert(++str1.cbegin(), {'a','b','c'});
    cout << str1 << endl;//1abc23456
    cout << *iter<< endl;//a
    cout << *(++iter) << endl;//b
    system("pause");
}

查找string

string类提供了6个不同的查找函数,每个函数有4个重载版本,当搜索失败时,返回一个名为string::npos的静态成员,标准库将npos定义为string::size_type类型并初始为-1。当搜索成功时,返回第一个匹配位置的下标。

搜索操作 说明
s.find(args) 查找s中args第一次出现的位置
s.rfind(args) 查找s中args最后一次出现的位置
s.find_first_of(args) 在s中查找args中任何一个字符第一次出现的位置
s.find_last_of(args) 在s中查找args中任何一个字符最后一次出现的位置
s.find_first_not_of(args) 在s中查找第一个不在args中的字符
s.find_last_not_of(args) 在s中查找最后一个不在args中的字符

args可以使如下形式:

args 说明
c,pos 从s中位置pos开始查找字符c,pos默认为0
s2,pos 从s中位置pos开始查找字符串s2,pos默认为0
cp,pos 从s中位置pos开始查找以空字符结尾的字符数组cp,pos默认为0
cp,pos,n 从s中位置pos开始查找以空字符结尾的字符数组cp的前n个字符,pos和n无默认值

转换整型或浮点数为string

int main()
{
    auto str1 = to_string(123456);
    auto str2 = to_wstring(3.15);
    system("pause");
}

转换string为整型

将string转换为整型时,如果string前面有空白符则会忽略,然后取尽可能多的字符转换。不能转换则抛出std::invalid_argument异常,若转换值落在结果类型的范围外则抛出std::out_of_range异常。

int main()
{
    string str1 = "-45";
    string str2 = "3.14159";
    string str3 = "+31337 with words";
    string str4 = "200000000000000000000000000";
    string str5 = "words and 2";

    //转换字符串为有符号整型
    int value1 = stoi(str1);
    long value2 = stol(str2);
    long long value3 = stoll(str3);

    //转换字符串为无符号整型
    //unsigned long value4 = stoul(str4);// std::out_of_range异常
    //unsigned long long value5 = stoull(str5);//std::invalid_argument异常

    cout << value1 << endl;//-45
    cout << value2 << endl;//3
    cout << value3 << endl;//31337
    system("pause");
}

将string转换为整型时,如果第二个参数不为空,则将首个不能转换为整型的字符的下标存储到第二个参数。

int main()
{
    size_t pos1 = 0;
    auto value1 = stoi("123456abcdefg", &pos1);
    cout << value1 << endl;//123456
    cout << pos1 << endl;//6

    size_t pos2 = 0;
    auto value2 = stoi("123456", &pos2);
    cout << value2 << endl;//123456
    cout << pos2 << endl;//6
    system("pause");
}

将string转换为整型时,第三个参数表示底数,默认为10,合法取值为{0,2,3,...,36},当底数为8或0时,前缀为0的字符串会以八进制解析,当底数为16或0时,前缀为0x的字符串会以十六进制解析。

int main()
{
    cout << stoi("20", nullptr, 16) << endl;//32
    cout << stoi("0x20", nullptr, 16) << endl;//32
    cout << stoi("0X20", nullptr, 0) << endl;//32
    cout << stoi("20", nullptr, 8) << endl;//16
    cout << stoi("020", nullptr, 8) << endl;//16
    cout << stoi("020", nullptr, 0) << endl;//16
    cout << stoi("20", nullptr, 36) << endl;//72
    //cout << stoi("20", nullptr, 37) << endl;//异常
    system("pause");
}

转换string为浮点数

int main()
{
    float value1 = stof("3.14");
    double value2 = stod("0.002");
    long double value3 = stold("222");

    auto value4 = stod("INFINITY");//无穷大
    auto value5 = stod("-INF");//负无穷大
    auto value6 = stod("NAN");//非数(NaN)表达式
    auto value7 = stod("-NAN");//非数(NaN)表达式
    cout << value4 << endl;
    cout << value5 << endl;
    cout << value6 << endl;
    cout << value7 << endl;
    system("pause");
}

获取string的hash值

int main()
{
    string str1{"xiaoming"};
    hash<string> hashHelper;
    cout << hashHelper(str1) << endl;//1939947627
    system("pause");
}

推荐阅读