你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

总结字符串操作知识

[复制链接]
gaosmile 发布时间:2020-10-9 22:07

字符串操作看似简单,其实非常重要,不注意的话,经常出现代码运行结果和自己想要的不一致,甚至崩溃。本文总结了一些构建string对象方法、修改string对象的方法、string类型的操作函数、string类型的查找、string对象的比较。

1 构建string对象方法

首先,为了在我们的程序中使用string类型,我们必须包含头文件 。如下:

#include <string>

声明一个字符串变量很简单:

string Str;

这样我们就声明了一个字符串变量,但既然是一个类,就有构造函数和析构函数。上面的声明没有传入参数,所以就直接使用了string的默认的构造函数,这个函数所作的就是把Str初始化为一个空字符串。

String类的构造函数和析构函数如下:

[td]
String类函数
说明
string s;生成一个空字符串s
string s(s2);拷贝构造函数 生成s2的复制品
string s("value");用字符串value初始化s
string s(b,e);以区间b,e内的字符作为字符串s的初值
string s(cp,n);取字符数组,前n个字符作初值
string s(s2,pos2);将字符串s2"始于位置pos2"部分当作字符串的初值
string s(s2,pos1,len);将字符串s2内"始于pos1且长度最多len"的部分作为字符串的初值
s.~string();销毁所有字符,释放内存

代码实例:

#include <iostream>
#include <string>

using namespace std;
//20200527  测试字符串操作  C语言与CPP编程

int main()
{
  string s1;
  cout <<s1 << endl;  //没有赋值输出为空

  string s2(10,'f');
  cout <<s2 << endl;  //用10个f定义字符串s2,输出ffffffffff

  string s3(s2);
  cout <<s3 << endl;  //用s2定义上,将s3拷贝给s2,s2和s3是不同的字符串,
  //只是构造的时候拷贝s2,修改其中一个不会影响另一个,s3输出位ffffffffff

  string s4(s3.begin(),s3.begin()+(s3.size())/2); //定义s4用迭代器做参数,从第一个迭代器s3.begin()
  cout <<s4 << endl;    //到第二个迭代器s3的一半即s3.size()/2结束,s3有10个f,s4输出为fffff

  char *cp = "Hello";            //最后有空字符/0
    char c_array[] = "world!!!!";  //最后有空字符/0
  char no_null[] = {'H','e','l','l','0'};    //最后没有空字符/0,不算C语言字符串,只是字符数组

  string ss1(cp);
  cout <<ss1 << endl;  //cp指向的字符串一个一个拷贝到ss1对象里,ssl输出为Hello

  string ss2(c_array,5);
  cout <<ss2 << endl;  //c_array数组名就是指向第一个字符w的指针,从w开始取5个,ss2为world

  string ss3(c_array+5,4);
  cout <<ss3 << endl;  //c_array+5指向第五个字符d,再取4个字符,ss3为!!!!

  //string ss4(no_null);//用字符数组为ss4赋值,因为找不到/0,不知道拷贝几个会出错
  string ss5(no_null,2); //这次取2个就知道什么时候结束,不会出错
  cout <<ss5 << endl;    //ss5为He

  s1 = "Hello";
  cout << s1 << endl;  //s1输出Hello

  string s6(s1,2);
  cout << s6 << endl;  //用s1初始化s6,2表示字符下标,从第二个字符开始到最后,s6为llo

  string s7(s1,0,2);
  cout << s7 << endl;  //从s10开始取2个,s7为He

  string s8(s1,0,8);
  cout << s8 << endl;  //从s1的第一个开始取8个,不够8个就结束,s8为Hello

  return 0;
}

** 运行结果**:

微信图片_20201009215105.jpg

2 修改string对象的方法

与容器共有的 string 操作:

[td]
与容器共有的 string 操作方法
说明
s.insert(p,t);在迭代器 p 指向的元素之前插入一个值为 t 的新元素,返回指向新插入元素的迭代器
s.insert(p,n,t);在迭代器 p 指向的元素之前插入 n 个值为 t 的新元素
s.insert(p,b,e);在迭代器 p 指向的元素之前插入迭代器 b 和 e 标记范围内所有的元素。返回 void
s.assign(b,e);在迭代器 b 和 e 标记范围内的元素替换 s。string类型,返回 s;容器类型返回 void
s.assign(n,t);用值为 t 的 n 个副本替换 s。对于 string 类型,该操作返回 s;对于容器类型,则返回 void
s.erase(p);删除迭代器 p 指向的元素。返回一个迭代器,指向被 删除元素后面的元素
s.erase(b,e);删除迭代器 b 和 e 标记范围内所有的元素。返回一个迭代器,指向被删除元素段后面的第一个元素

代码实例

#include <iostream>
#include <string>

using namespace std;
//2020.05.27 测试字符串操作  公众号:C语言与CPP编程

int main()
{
  string s("hello");
  string s2("abcdef");

  string::iterator  p =  s.begin();  //迭代器p

  s.insert(p,'A');   //在迭代器p指向的s开始之前插入A
  cout << s << endl;   //s为Ahello

  s.insert(p,3,'B');  //p指向返回的Ahello的A处,在A之前插入3个B
  cout << s << endl;   //s为BBBAhello

  string::iterator  b =  s2.begin();  //迭代器b
  string::iterator  e =  s2.end();  //迭代器e

  //p = s.begin();       //p指向s
  s.insert(p,b,e);     //在p指向的s之前插入b和e迭代器范围内的元素abcdef
  cout << s << endl;   //s为abcdefBBBAhello

  s = "hello";
  cout << s << endl;   //s为hello

  s.assign(b,e);      //s所有的元素倍替换为b到e之间的元素,b与e之间为s2
  cout << s << endl;   //s为abcdef

  s.assign(8,'K');
  cout << s << endl;   //s为KKKKKKKK

  p = s2.begin();     //迭代器p指向s2的a
  s2.erase(p);         //删除迭代器p指向的元素a
  cout << s2 << endl;  //s2为bcdef

  p = s2.begin();     //a被删除,p指向b
  p++;                //指向c
  p++;                //指向d
  string::iterator p2 = s2.end(); //p2迭代器指向f
  p2--;                            //指向e
  s2.erase(p,p2);                  //删除p指向的d和p2指向的e之间的元素
  cout << s2 << endl;              //s2为bcf

  return 0;
}

运行结果

微信图片_20201009215109.png 运行结果

string 类型特有的版本

string以数组的形式存储,可以用数组的下标进行修改操作:

[td]
string 修改操作方法
说明
s.insert(pos,n,c);在下标 pos 的元素之前插入 n 个字符 c
s.insert(pos,s2);在下标 pos 的元素之前插入 string 对象 s2
s.insert(pos,s2,pos2,len);在下标为 pos 的元素之前插入 s2 中从下标   pos2 开始的 len 个字符
s.insert(pos,cp,len);在下标为 pos 打元素之前插入 cp 所指向数组的前len 个字符
s.insert(pos,cp);在下标为 pos 的元素之前插入 cp 所指向的以空字符结束的字符串副本
s.assign(s2);用 s2 的副本替换 s
s.assign(s2,pos2,len);用 s2 中从下标 pos2 开始的 len 个字符替换 s
s.assign(cp,len);用 cp 所指向数组的前 len 个字符副本替换 s
s.assign(cp);用 cp 所指向的以空字符结束的字符串替换 s
s.erase(pos,len);删除从下标 pos 开始的 len 个字符

代码实例

#include <iostream>
#include <string>

using namespace std;
//2020.05。27 测试字符串操作  公众号:C语言与CPP编程

int main()
{
  string s("hello");
  string s2("abc");

  s.insert(0,3,'A');   //在s下标是0之前插入3个A
  cout << s << endl;   //s为AAAhello

  s.insert(5,s2);      //在AAAhello下标是5的元素之前插入abc
  cout << s << endl;   //s为AAAheabcllo

  s2 = "123456";
  s.insert(0,s2,2,3);   //在s的下标是0之前插入s2下标为2开始往后的3个元素345
  cout << s << endl;   //s为345AAAheabcllo

  char *cp = "Stately plup Buck";
  s.assign (cp,7);
  cout << s << endl;   //s为Stately

  s.assign(cp);         //没有长度,默认是拷贝全部
  cout << s << endl;   //s为Stately plup Buck

  s = "hello";
  s.insert (0,cp,7);
  cout << s <<endl;   //s为Statelyhello

  s.insert(0,cp);
  cout << s <<endl;   //s为Statelyhello

  s = "hello";
  s2 = "abcdef";

  s.assign(s2,2,3);    //s2中下标为2开始3个元素赋值给s;
  cout << s <<endl;   //s为cde

  s.assign(s2);
  cout << s <<endl;   //s为abcdef

  s.erase (2,3);      //从下标为2开始删除s中的3个元素
  cout << s <<endl;   //s为abf

  s = "123456789";
  s.erase(s.size()-5,5); //删除s中后5个
  cout << s <<endl;   //s为1234

  s.insert(s.size(),5,'!'); //在s下标为s.size()处,插入5个!
  cout << s <<endl;   //s为1234!!!!!

  s = "abc";
  s.erase(0,1).insert(0,"A");  //先从下标为0之前删除一个a为bc,再插入A
  cout << s <<endl;   //s为Abc

  s = "abc";
  s[0] = 'A';      //用数组的方式处理
  cout << s <<endl;   //s为Abc

  return 0;
}

运行结果

微信图片_20201009215113.png 运行结果


3 适合string类型操作的函数
  • substr()主要功能是复制子字符串,要求从指定位置开始,并具有指定的长度。
  • append() 方法在被选元素的结尾(仍然在内部)插入指定内容。提示:如需在被选元素的开头插入内容,请使用prepend()方法。
  • replace() 该函数返回一个字符串,其中指定的字符串已经被替换为另一字符串,并且替换的次数也可以指定。

代码实例:

#include <iostream>
#include <string>

using namespace std;
//2020.05.27 测试字符串操作  公众号:C语言与CPP编程

int main()
{
  string s("Hello world");
  string s2 = s.substr(6,5);  //从第6个开始取5个
  cout << s2 << endl ;        //s2为world

  s2 = s.substr(6);  //从第6个开始取拷贝所有的
  cout << s2 << endl ;        //s2为world

  s2 = s.substr(6);    //s2拷贝s的全部,相当于s2=s
  cout << s2 << endl ;  //s2为Hello world

  s = "C++ Primer";
  s.append(" 3rd Ed");   //再s最后添加3rd Ed
  cout << s<< endl ;  //s为C++ Primer 3rd Ed

  s = "C++ Primer";
  s.insert(s.size()," 3rd Ed"); //最后插入
  cout << s<< endl ;  //s为C++ Primer 3rd Ed

  s.replace(11,3,"4th");       //下标11开始3个替换4th
    cout << s<< endl ;  //s为C++ Primer 4th Ed

  s.replace(11,3,"Fourth");       //下标11开始3个替换Fourth
    cout << s<< endl ;        //s为C++ Primer Fourth Ed

  s = "C++ Primer 3rd Ed";    //replace相当于先删除后插入
  s.erase (11,3);            //删除3rd
  s.insert(11,"Fourth");      //插入Fourth
  cout << s<< endl ;     //s为C++ Primer Fourth Ed

  return 0;
}

运行结果

微信图片_20201009215116.png 运行结果


4 string类型的查找[td]
查找函数
说明
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 的字符

代码实例

#include <iostream>
#include <string>

using namespace std;
//2020.05.27 测试字符串操作  公众号:C语言与CPP编程

int main()
{
  string name("AnnaBelle");
  string::size_type pos1 = name.find("Bell");
  cout << pos1 << endl;     //返回下标4,如果没找到返回npos

  if(pos1 == string::npos)
     cout << "没找到!" << endl;
  else
     cout << "找到了!下标:" << pos1 <<endl;

  name = "2sn3";
  string numerics("0123456789");
  string::size_type pos = name.find_first_of(numerics);  //在2sn3中查找0123456789中任意一个第一次出现
  if(pos == string::npos)
     cout << "没找到!" << endl;
  else
     cout << "找到了!下标:" << pos <<endl;       //找到了!下标:0

  //其他类型的查找这里就不举例子了

  return 0;
}

运行结果

微信图片_20201009215120.png 运行结果


5 string对象的比较[td]
string对象比较函数compare用法
说明
str1.compare(str2);如果相等则输出为0,str1>str2输出大于0,否则,输出小于0
str1.compare(m,n,str2);str1的子串(从索引m开始,包含n个字符)与str2进行比较
str1.compare(m,n,str2,m,n);str1的子串(从索引m开始,包含n个字符)与str2的子串(从索引m开始,包含n个字符)进行比较

代码实例:


#include <iostream>
#include <string>
#include <cctype>
using std::cout;
using std::endl;
using std::cin;
using std::string;
int main(void)
{
  string str1="hi,test,hello";
  string str2="hi,test";
  //字符串比较
  if(str1.compare(str2)>0)
    printf("str1>str2\n");
  else if(str1.compare(str2)<0)
    printf("str1<str2\n");
  else
    printf("str1==str2\n");

  //str1的子串(从索引3开始,包含4个字符)与str2进行比较
  if(str1.compare(3,4,str2)==0)
    printf("str1的指定子串等于str2\n");
  else
    printf("str1的指定子串不等于str2\n");

  //str1指定子串与str2的指定子串进行比较
  if(str1.compare(3,4,str2,3,4)==0)
    printf("str1的指定子串等于str2的指定子串\n");
  else
    printf("str1的指定子串不等于str2的指定子串\n");

  //str1指定子串与字符串的前n个字符进行比较
  if(str1.compare(0,2,"hi,hello",2)==0)
    printf("str1的指定子串等于指定字符串的前2个字符组成的子串\n");
  else
    printf("str1的指定子串不等于指定字符串的前2个字符组成的子串\n");
  return 0;

}

运行结果

微信图片_20201009215123.png
运行结果

收藏 评论0 发布时间:2020-10-9 22:07

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版