C_串----基本string字符系列容器
来源:互联网 发布:淘宝卖家查看退款记录 编辑:程序博客网 时间:2024/05/19 21:00
String类是不可变(final)的,对String类的任何改变,都是返回一个新的String类对象.这样的话把String类的引用传递给一个方法,该方法对String的任何改变,对原引用指向的对象没有任何影响,这一点和基本数据类型相似.
//这样操作之后s1是"abc",s2是"def".
a 和 b 是不是指向同一个地址呢,这个问题在各论坛都是谈论很激烈,其实很简单,跟下这些字符串的内存地址就好了
a的地址指向02A62208h,b的地址也是02A62208h,这说明了什么,创建b的时候.net机制肯定是先去查找内存中是否有这个字符串的内存地址,如果有则指向,没有才创建(来自360百度百科。)
C++STL提供了string基本字符系列容器来处理字符串,可以把string理解为字符串类,它提供了添加、删除、替换、查找和比较等丰富的方法。
String基本操作函数定义:
#include<string>#include<iostream>using namespace std;string::iterator it;//定义迭代器变量 string s,childs;/*尾部添加字符*/s.append(childs);s+=childs;/*删除字符*/int num,num1,num2; it=begin;s.erase(it+num);//删除第num个元素,数组从0开始计数s.erase(it+num1,it+num2);//删除第num1到num2区间所有元素,数组从0开始计数/*返回字符串长度*/s.length();/*替换string对象的字符*/int n;int num;s.replace(n,num,childs);//从第n个开始将连续的num个字符替换为childs字符串/*搜索子串或字符,查找到返回下标值,查找不到返回4294967295*/s.find(childs); /*string对象的比较*/s.compare(childs);//返回-1则s<childs,返回0则s=childs,返回1则s>childs/*反向排序string*/reverse(s.begin(),s.end());
scanf的输入速度比cin快很多
scanf()是C语言的函数,不支持string对象
1、从string对象尾部添加字符:
(1)直接采用"+"操作符,代码如下:
#include<string>#include<iostream>using namespace std;int main(){string s;s=s+"abc";s=s+"123";cout<<s<<endl; //abc123 return 0; }
(2)采用append()方法,代码如下:
#include<string>#include<iostream>using namespace std;int main(){string s;s.append("abc"); s.append("123");cout<<s<<endl; //abc123 return 0; }
2、给String对象插入字符:
#include<string>#include<iostream>using namespace std;int main(){string s;s="123456";//定义迭代器 string::iterator it;//迭代器位置为字符串首it=s.begin();//把字符'p'插入到第1个字符前(字符位置从0开始计数)s.insert(it+1,'p');cout<<s<<endl;//1p23456 return 0; }
3、访问string对象的元素:
一般使用下标方式随机访问string对象的元素,下标是从0开始计数的。另外,string对象的元素是一个字符(char),代码如下:
#include<string>#include<iostream>using namespace std;int main(){string s;s="abc123456";//输出string对象的首元素cout<<s[0]<<endl;//a//两个相同的字符相减值为0cout<<s[0]-'a'<<endl; //0return 0; }
4、删除string对象的元素:
(1)清空一个空字符串,则直接给它赋空字符串即可。
(2)使用erase()方法删除迭代器所指的那个元素或一个区间中的所有元素。代码如下:
#include<string>#include<iostream>using namespace std;int main(){string s;s="abc123456";//定义迭代器变量,指向字符串对象首元素string::iterator it=s.begin();//删除第3个元素,元素位置从0开始计数s.erase(it+3);cout<<s<<endl;//abc23456//删除0-4区间的所有元素s.erase(it,it+4);cout<<s<<endl;//3456//清空字符串s="";//输出字符串的长度cout<<s.length()<<endl;//0 return 0; }
5、返回string对象的长度
采用length()方法可返回字符串的长度;采用empty()方法,可返回字符串是否为空,如果字符串为空,则返回逻辑真,为1,否则,返回逻辑假,即0。代码如下:
#include<string>#include<iostream>using namespace std;int main(){string s;s="abc123456";//输出字符串的长度 cout<<s.length()<<endl;//清空字符串s=""; //(空的空格也算字符)//判断字符串是否为空cout<<s.empty()<<endl;return 0; }
使用replace()方法可以很方便地替换string对象中的字符,replace()方法的重载函数相当多,常用的只有一两个,具体代码如下:
#include<string>#include<iostream>using namespace std;int main(){string s;s="abc123456";//从第3个开始,将连续的3个字符替换为"good" //即将"abc"替换为"good"s.replace(3,3,"good");cout<<s<<endl;//abcgood456return 0; }
采用find()方法可查找字符串中的第一个字符元素(char)或者子串(用双引号来界定),如果查找到,则返回下标值(),如果查不到,则返回4294967295,这个值是int能存储下的最大整数,4294967295+1在int类型里面得到结果是0。
#include<string>#include<iostream>using namespace std;int main(){string s;s="cat dog cat";//查找第一个字符'c',返回下标值cout<<s.find('c')<<endl;//0//查找第一个子串'c',返回下标值cout<<s.find("c")<<endl;//0 //查找第一个子串"cat",返回下标值 cout<<s.find("cat")<<endl;//0 //查找第一个子串"dog",返回下标值 cout<<s.find("dog")<<endl;//0 //查找第一个子串"dogc",查找不到则返回4294967295 cout<<s.find("dogc")<<endl; //4294967295return 0; }
string对象可与使用compare()方法与其他字符串相比较。如果它比对方大,则返回1,如果它比对方小,则返回-1,;如果它与对方相同(相等),则返回0
#include<string>#include<iostream>using namespace std;int main(){string s;s="cat dog cat";//s比"cat"字符串大,返回1cout<<s.compare("cat")<<endl;//1 //s与"cat dog cat"相等,返回0cout<<s.compare("cat dog cat")<<endl;//1//s比"dog"小,返回-1cout<<s.compare("dog")<<endl;//1return 0; }
(在编译器MinGW上可能返回大于1的值,只要是大于0就表示真)
9、用reverse反向排序string对象
采用reverse()方法可将string对象迭代器所指向的一段区间中的元素(字符)反向排序。reverse()方法需要声明头文件#include<algorithm>
#include<string>#include<iostream>#include<algorithm>//算法 using namespace std;int main(){string s;s="123456789";reverse(s.begin(),s.end());cout<<s<<endl;//987654321return 0;}
嗯下面就是在VC中基本操作的实现:
#include<string>#include<iostream>#include<algorithm> using namespace std;int main(){int ch; string s,s1,s2;string::iterator it; printf("请输入字符串S:");cin>>s; printf("*******************************\n");printf("1、添加字符\n2、删除字符\n3、返回串长\n");printf("4、访问字符\n5、判空字符\n6、替换字符\n");printf("7、搜素子串\n8、串的比较\n9、反向排列\n");printf("0、退出操作");printf("*******************************\n");printf("选择要进行的操作:");while(scanf("%d",&ch)&&ch!=0){if(ch==1){printf("请输入插入的字符:");cin>>s1;s+=s1;//s.append(s1); cout<<"生成新的字符串:"<<s<<endl; }if(ch==2){int n;it=s.begin();printf("输入要删除字符的位置:");scanf("%d",&n);s.erase(it+n-1);cout<<"生成新的字符串:"<<s<<endl; }if(ch==3){cout<<"串的长度为:"<<s.length()<<endl;}if(ch==4){int n;printf("请输入要访问第几个字符:");scanf("%d",&n);cout<<s[n-1]<<endl;}if(ch==5){if(!s.empty())printf("此时不是空字符串!\n");elseprintf("此时是空字符串!\n");}if(ch==6){int n,m;printf("请输入要替换的字符:");cin>>s1;printf("请输入要替换的起始位置:");scanf("%d",&n);printf("请输入要替换原始字符的个数:");scanf("%d",&m);s.replace(n,m,s1); cout<<"生成新的字符串:"<<s<<endl; }if(ch==7){printf("请输入要搜索的子串:");cin>>s1;cout<<s.find(s1)<<endl;}if(ch==8){printf("请输入要比较的两个字符串!\n");printf("请输入字符串S1:");cin>>s1;printf("请输入字符串S2:");cin>>s2;if(s1.compare(s2)<0){printf("字符串S1<S2\n");}else if(s1.compare(s2)==0){printf("两字符串相等\n");}else{printf("字符串S1>S2\n");}}if(ch==9){reverse(s.begin(),s.end());cout<<s<<endl;}printf("选择要进行的操作:");}printf("成功退出程序!\n");return 0;}
(参考书籍:ACM程序设计)
- C_串----基本string字符系列容器
- string基本字符系列容器
- String基本字符系列容器
- string基本字符系列容器
- string基本字符系列容器
- string基本字符系列容器(一)
- string基本字符系列容器(二)
- STL string基本字符系列容器
- string基本字符容器
- string基本字符容器
- string基本字符序列容器
- string 基本字符序列容器
- ACM学习历程9——string基本字符系列容器
- STL(十七)string基本字符序列容器
- C_转义字符
- C_字符串 PK string
- C_栈和队列----queue队列容器
- C_栈和队列----stack堆栈容器
- Dubbo-02:使用zookeeper的简单demo
- C.Primer.Plus(第六版)第14章 编程练习
- opencv: 形态学 转换(图示+源码)
- JavaScript中隐式的强制转换
- TensorFlow概要
- C_串----基本string字符系列容器
- JNI编译时错误 编码GBK的不可映射字符 解决方法
- java设计模式之外观模式(门面模式) 针对外观模式,在项目开发和实际运用中十分频繁,但是其极易理解,下面就简要介绍一下。 一、概念介绍 外观模式(Facade),他隐藏了系统的复杂性,并
- tablayout加viewpager
- linux下安装mysql数据库
- 关于网站所有404页面替换为腾讯公益404页面的说明
- c++中关于设置左对齐和右对齐的问题解决方法
- oracle 数据库 练习题 3
- Android 入门资料汇总