文章目录
头文件string.h与cstring的区别
“string.h”和ctring都是用来定义处理字符数组char函数的头文件,后者只不过是C++语言为了统一标准命名空间管理而建立另一个管理函数的头文件,内容都差不多,稍有改进。
C/C++中关于字符串头文件有很多,这里先稍微介绍一下“string.h”,“cstring”,“string”头文件以及MFC库中CString类的区别。
CString说了是MFC中专属类,不作图形界面暂且不用掌握,实际使用和“string”头文件string类很相似。
“string.h”头文件中则包含的是C语言标准库定义的,用来处理字符数组char的函数方法。
“cstring”头文件实际上只是在一个命名空间std中包含了“string.h”,这是因为C++要减少名称污染,当遇到用户自己定义了名称相同的函数,能够与标准库std中函数区分开。
而“string”是包含了C++专门定义一个处理字符串的类string的头文件。
string类对象的各种方法函数
初始化
char *pl = "Hello!";
string a = "World yeyey";//类中重载了赋值符号,可以直接赋值字符串常量
string b = pl; //字符串数组赋值初始化
string str("abc"); //调用有参构造函数赋值
string c(pl); //同上
string d = c; //赋值符号重载
string e (5,'a'); //n个字符初始化
重载运算符
string类中重载了很多操作符,例如:
赋值“=,+=”、比较操作符“>, <, >=, <=, ==, !=”,移位操作符“<<, >>”,连接“+”等等。
e += a; //e的结果为:"aaaaaWorld yeyey"
访问字符串字符
char al = a[1]; //访问第二个元素,'o'
char alNew = a.at(0); //访问第一个元素,‘W’
string::iterator i;
for(i=a.begin();i<a.end();i++)
cout<<*i; //从头打印字符串a,迭代子可以看成就是指针,通过指针符间接访问
字符串查找/增加/插入/交换等操作
e.append(a); //字符串a附加到字符串e尾部,类似“+”操作符
e.empty(); //判断字符串e是否为空,空则返回1,否则返回0
e.swap(a); //交换字符串对象e和a的值
char nzArr[20]={0};
e.copy(nzArr,5,0) //拷贝字符串e从第0(默认也为0)索引到第五给字符数组
int i = a.find('W');//找到对应字符再字符串a中最先出现的索引位
string strInst = e.insert(3,"vvvvvv");//在e字符串3索引位上插入一个字符串,并赋给新字符串对象
string strSub = e.substr(0,size(e)-5);//取(第一个参数默认为0,也可以不写)0至倒数第5个字符
string strEra = e.erase(0,size(e)-5);//删除对应段字符赋给新字符串
在求字符串长度上,string可以代替传统的C字符串,所以应该针对C中的strlen,给出相应的函数length( )。也可以用作STL容器,所以要按照STL容器的惯例给出size( )。
字符串大小
e.size();
e.length(); //两个都是求字符串e的长度,使用上没有区别
//string函数
char nzArr[100] = "abcdef";
int nLen = strlen(nzArr); //结果为6,并不是100,和分配数组内存大小无关
字符串输入输出操作
string str;
cin>>str; //输入,取字符串遇空格停
cout<<str<<endl; //输出
getline(cin,str);//获得一行字符串
详细操作见:
csdn无鞋童鞋
字符串比较大小
string str1="123";
string str2="123";
if(str1.compare(str2)==0)
cout<<"equal"<<endl; // 如果两个字符串相等则输出“equal”
//string函数
char nzArr[10]="abc",nzBuf[10]="abC";
int nRel = strcmp(nzArr,nzBuf); //结果为1
int nRel1 = strcmpi(nzArr,nzBuf);//结果为0
int nRel2 = strncmp(nzArr,nzBuf,2);//结果为0
字符串拷贝、连接、赋值函数
拼接函数strcat
拼接函数,用来将后一个字符数组内容加载在前一个字符数组的后面,并且会自动去除前一个字符数组最后的字符结束符’\0’
char nzArr[100]="abcd",nzBuf[100]="DDDD";
strcat(nzArr,nzBuf); //nzArr结果为“abcdDDDD”,注意不要超过字符数组空间大小
strset
设定字符数组全为某一字符,如果存在‘\0’结束符,遇结束符停止赋值。
char nzArr[100]="abcd";
strcat(nzArr,'g'); //nzArr结果为“gggg”,如果未初始化,则100个空间都为'g'
memset
与strset类似,赋值字符数组指定字符,但可以指定个数。
char nzArr[100]="abcd";
memset(nzArr,'g',sizeof(nzArr)); //nzArr中全为0,该函数是空间操作,不遇'\0'停止
strstr/strchr
都是查找第二个参数第一次出现在第一个字符数组的位置,前者是查找字符数组,而后者是字符。但是注意返回,返回的是参数出现的地址,需要赋给char*指针来存储,而不是一个索引。
char nzArr[10] ="ababcde",nzBuf[10]="abc";
char* nzCount = (char*)malloc(sizeof(char)*10);
char* nzCount1 = (char*)malloc(sizeof(char)*10);//结果分配空间
memset(nCount,0,sizeof(nCount)); //赋初值
memset(nCount1,0,sizeof(nCount1)); //防止未匹配到指定字符或字符数组,而成为野指针
nzCount = strstr(nzArr,nzBuf); //返回为'abcde'
nzCount1 = strstr(nzArr,'c'); //返回为'cc'
字符串查找
char a[] = "abcddabc";
char b[] = "dda";
int j;
string str1(a);
string str2(b);
//方法一
int i = str1.find(str2); //返回即子字符串索引3
//方法二
char *rel = strstr(a, b); //首次出现地址,strstr保存的是ddabc