大总结C++字符串<cstring><string>常用函数

C语言风格的字符串

需包含头文件<cstring>,或写成<string.h>

C风格的字符串实际上是使用 null 字符 ‘\0’ 终止的一维字符数组。

  • 输入字符串长度一定小于已定义的字符数组长度,最后一位是/0终止符号;不然输出时无法知道在哪里结束。
    字符数组的定义和初始化
strcat(char s1[],const char s2[]);//将s2接到s1上
strcpy(char s1[],const char s2[]);//将s2复制到s1上
strcmp(const char s1[],const char s2[]);//比较s1,s2 s1>s2返回1 相等返回1,否则返回-1
strlen(char s[]);//计算字符串s的长度 字符串s的实际长度,不包括\0在内

strcat()

strcpy()

strcmp()相等返回0,否-1

strlen()计算字符串的实际长度,不包括\0在内

C++字符串

包含头文件<string>

字符串的定义与初始化

string s1();  // si = ""
string s2("Hello");  // s2 = "Hello"
string s3(4, 'K');  // s3 = "KKKK"
string s4("12345", 1, 3);  //s4 = "234",即 "12345" 的从下标 1 开始,长度为 3 的子串
string a;
string b=a;//也可以写成string b(a)
string c="hello";//string c("hello")
string f=(c,1);//将字符串c中从下标1开始到字符串结束的位置作为字符串初值

string 类没有接收一个整型参数或一个字符型参数的构造函数。下面的两种写法是错误的:

string s1('K');
string s2(123);

 assign 成员函数,可以用来对 string 对象赋值。assign 成员函数返回对象自身的引用。例如:

string s1("12345"), s2;
s3.assign(s1);  // s3 = s1
s2.assign(s1, 1, 2);  // s2 = "23",即 s1 的子串(1, 2)
s2.assign(4, 'K');  // s2 = "KKKK"
s2.assign("abcde", 2, 3);  // s2 = "cde",即 "abcde" 的子串(2, 3)

length(),size()求字符串的长度

capacity()返回当前容量(即string中不必增加内存即可存放的元素个数,一般是15,如果超过了15获得的容量大小就跟size()是一样的)

string s="hello";
cout<<s.length();//5
cout<<s.size();//5
cout<<s.capacity();//15

resize(n,s)改变容器的大小设置为n

如果n<原来容器的大小,则保留原容器前n个元素,超过n的全部去除

如果n>原来容器的大小,则重新分配内存空间,并且在原来数据末尾插入数据合适数量的单个数据s是容器的大小达到n

append()字符串连接

  • 字符连接可以用符号+或+=,还可以用append()函数
  • append(s):直接把数据s添加到字符串末尾
  • append(s,start,end):在原来的字符串末尾添加s字符串从索引为start开始到索引为end结束的字符,end超过s的长度则直接添加s
  • append(s,n):在原来字符串末尾添加s字符串从左往右取n个的字符
  • append(n,c):在原来字符串末尾添加n个c字符
#include <iostream>
#include <string>
using namespace std;

int main()
{

    string s = "he";
    s.append("123");
    cout << s << endl;
    s.append("ding", 1, 4);
    cout << s << endl;
    s.append("char", 3);
    cout << s << endl;
    s.append(3, 'k');
    cout << s << endl;
    return 0;
}

insert()

  • insert(index,n,c):在index位置插入n个字符c
  • insert(index,s):在index位置插入字符串s
  • insert(index,s,n):在index位置插入字符串s从头开始的n个字符
  • insert(index,s,strat_index,n):在index位置插入字符串s从索引为strat_index开始的n个字符

string比较compare()

除了可以用 <、<=、==、!=、>=、> 运算符比较 string 对象外,string 类还有 compare 成员函数,可用于比较字符串。compare 成员函数有以下返回值:

  • 小于 0 表示当前的字符串小;
  • 等于 0 表示两个字符串相等;
  • 大于 0 表示另一个字符串小。
int n = s1.compare(s2);
n = s1.compare(1, 2, s2, 0, 3);  //比较s1的子串 (1,2) 和s2的子串 (0,3)
n = s1.compare(0, 2, s2);  // 比较s1的子串 (0,2) 和 s2
n = s1.compare("Hello");
n = s1.compare(1, 2, "Hello");  //比较 s1 的子串(1,2)和"Hello”
n = s1.compare(1, 2, "Hello", 1, 2);  //比较 s1 的子串(1,2)和 "Hello" 的子串(1,2)

string 对象的子串substr()

substr(n,m),如果省略了m或m超过了字符串的长度,则求出来的子串就是从下标n开始一直到字符串结束的部分

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

int main()
{
    string s = "apple";
    string b = s.substr(1, 4);
    cout << s << endl
         << b << endl;
    string c = s.substr(2);
    cout << c;
    return 0;
}

交换两个字符串内容swap()

string s1("West”), s2("East");
s1.swap(s2);  // s1 = "East",s2 = "West"

字符串替换replace()

replace(0, 5, str); //用str替换从指定位置0开始长度为5的字符串
replace(0, 9, str, 4);  //用str的前4个字符替换从0位置开始长度为9的字符串  
replace(0, 9, 3, c);    //用重复3次的c字符替换从指定位置0长度为9的内容
replace(19,6,str,9,6)  //用str的从索引为9开始长度为6的字符串去替换原来字符串从19位置长度为6的内容
        

字符串删除erase()

string s1("Real Steel");
s1.erase(1, 3);  //删除子串(1, 3),此后 s1 = "R Steel"
s1.erase(5);  //删除下标5及其后面的所有字符,此后 s1 = "R Ste"

查找字符串函数find()、rfind()

所有string字符串查找函数都有唯一的返回类型,就是size_type,即一个无符号整数,若查找成功,返回查找规则的第一个字符或者子串的位置,若查找失败,则返回npos,

  • find:从前往后查找子串或字符出现的位置。
  • rfind:从后往前查找子串或字符出现的位置。
  • find_first_of:从前往后查找何处出现另一个字符串中包含的字符。例如:
  • s1.find_first_of("abc");  //查找s1中第一次出现"abc"中任一字符的位置
  • find_last_of:从后往前查找何处出现另一个字符串中包含的字符。
  • find_first_not_of:从前往后查找何处出现另一个字符串中没有包含的字符。
  • find_last_not_of:从后往前查找何处出现另一个字符串中没有包含的字符。
#include<iostream>
#include<string>

using namespace std;

int main()
{
    //测试size_type find (charT c, size_type pos = 0) const noexcept;
    string st1("babbabab");
    cout << st1.find('a') << endl;//1   由原型知,若省略第2个参数,则默认从位置0(即第1个字符)起开始查找
    cout << st1.find('a', 2) << endl;//4   在st1中,从位置2(b,包括位置2)开始,查找字符a,返回首次匹配的位置,若匹配失败,返回npos
    cout << st1.find('a', 100) << endl;//4294967295   当查找的起始位置超出字符串长度时,按查找失败处理,返回npos
    
    string st2("aabcbcabcbabcc");
    string str1("abc");
    cout << st2.find(str1, 2) << endl;//6   从st2的位置2(b)开始匹配,返回第一次成功匹配时匹配的串(abc)的首字符在st2中的位置,失败返回npos    
    cout << st2.find("abc", 2) << endl; //6   同上,只不过参数不是string而是char*
    
    cout << st2.find("abcdefg", 2, 3) << endl;//6   取abcdefg得前3个字符(abc)参与匹配,相当于st2.find("abc", 2)    
    cout << st2.find("abcbc", 0, 6) << endl;//4294967295   第3个参数超出第1个参数的长度时,返回npos
    return 0;
}

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s1("Source Code");
    int n;
    if ((n = s1.find('u')) != string::npos) //查找 u 出现的位置
        cout << "1) " << n << "," << s1.substr(n) << endl;
    //输出 l)2,urce Code
    if ((n = s1.find("Source", 3)) == string::npos)
        //从下标3开始查找"Source",找不到
        cout << "2) " << "Not Found" << endl;  //输出 2) Not Found
    if ((n = s1.find("Co")) != string::npos)
        //查找子串"Co"。能找到,返回"Co"的位置
        cout << "3) " << n << ", " << s1.substr(n) << endl;
    //输出 3) 7, Code
    if ((n = s1.find_first_of("ceo")) != string::npos)
        //查找第一次出现或 'c'、'e'或'o'的位置
        cout << "4) " << n << ", " << s1.substr(n) << endl;
    //输出 4) l, ource Code
    if ((n = s1.find_last_of('e')) != string::npos)
        //查找最后一个 'e' 的位置
        cout << "5) " << n << ", " << s1.substr(n) << endl;  //输出 5) 10, e
    if ((n = s1.find_first_not_of("eou", 1)) != string::npos)
        //从下标1开始查找第一次出现非 'e'、'o' 或 'u' 字符的位置
        cout << "6) " << n << ", " << s1.substr(n) << endl;
    //输出 6) 3, rce Code
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值