参考自:https://www.cnblogs.com/lifexy/p/8642163.html(未整理完)
带空格的字符数组整行读入
- gets(s); 注意:有些评测系统会出错。
- cin.getline(s,l);
带空格的字符串整行读入
- getline(cin,str);
字符串操作
- 反转字符串
通过里的reverse实现
string str("hello");
reverse(str.begin(),str.end());
cout<
字符数组
-
字符数组的相关函数
- 求长度
strlen(s) //求s的长度('\0'不算在内)
- 复制
strcpy(s1,s2) //将s2复制到s1(原s1清除) strncpy(s1,s2,n) //将s2的前n个字符复制到s1(原s1后半部分会保留)
//示例: char s1[100],s2[100]; int main(){ strcpy(s1,"abcdef"); strcpy(s2,"1234"); strncpy(s1,s2,3); cout<
- 增加
strcat(s1,s2) //将s2增加到s1后面,返回s1首地址 strncat(s1,s2,n) //将s2的前n个字符增加到s1后面
- 大小写转换
strlwr(s) //将s中大写字母转换成小写字母 strupr(s) //将s中小写字母转换成小写字母 //注:strupr不是标准C库函数,只能在VC中使用。在linux gcc环境下需要自行定义这个函数。
- 比较
strcmp(s1,s2) //如果s1>s2,返回正数 //如果s1=s2,返回0 //如果s1
- 查找
strspn(str1,str2) //统计str1中在str2出现过的字符数 strcspn(str1,str2) //统计str1中没在str2出现过的字符数 strstr(str1,str2) //在str1中查找str2第一次出现的位置(地址) strchr(str,ch) //返回ch在str中第一次出现的位置 //如果没有找到返回NULL,即0000000000000000(空地址) strrchr(str,ch) //返回ch在str中最后一次出现的位置
- 字符数组与数的转换
sscanf(s,"%d",&n) //将字符数组S转换成数字n sprintf(s,"%d",N) //将数字n转换成字符数组S int n=atoi(s) //将s按十进制转换成数字返回
字符串(string类)
string类常用的构造函数
string str;
//生成一个空字符串
string str ("ABC")
//等价于 str="ABC"
string str ("ABC", strlen)
// 将"ABC"存到str里,最多存储前strlen个字节
string s("ABC",stridx,strlen)
//将"ABC"的stridx位置,做为字符串开头,存到str里.且最多存储strlen个字节.
string s(strlen, 'A')
//存储strlen个'A'到str里
字符串转字符数组常量
- 函数c_str(),【返回常量】
返回一个常量C字符串, 内容与本string串相同。当本string的内容改变或被析构后,返回的c字符串常量也不会改变,因为返回的c字符串常量是重新通过new char[]出来的
#include
#include
using namespace std;
string *str=new string("ABCD");
const char *s=str->c_str();
int main(){
printf("&s=%p,&str=%p\n",s,str);
cout<append("EF");
cout<
- 函数data(),【返回常量】
用法同c_str()
const char *s1= str.data(); //将string类转为字符串数组,返回给s1
- 函数copy(),【通过参数带回到变量】
str.copy(s,count,pos); 将str里的pos位置开始,拷贝count个字符,存到s里.
string str("ABCDEFGABCD");
char *s=new char[10];
str.copy(s,5,2); //s带回“CDEFG"
常用函数
插入
s.insert(n,str)
//在s的下标为n的位置,插入str
删除
//string str="ABCD";
s.erase(n)
//删除下标n及以后的内容
//比如: str.erase(2);即"ABCD" --> "AB"
s.erase(n,l)
//从下标为n的位置删除l个
//比如:str.erase(2,1); 即"ABCD" --> "ABD"
查找
- find():从头查找某个字符串,查找成功返回位置,查找失败返回-1。例:
string str("ABCDEFGABCD");
n=str.find('A'); //n=0
n=str.find("AB"); //n=0
n=str.find("BC",1); //从位置1处,查找“BC”,n=1
n=str.find("CDEfg",1,3);
//从位置1处,查找“CDEfg”的前3个字符,等价于str.find("CDE",1),n=2
- rfind():反向查找,从末尾处开始,向前查找。例:
string str("ABCDEFGABCD");
n=str.rfind("CD"); //从位置10开始向前查找,n=9
n=str.rfind("CD",5); //从位置5开始向前查找,n=2
n=str.rfind("CDEfg",5,3); //等价于str.rfind("CDE",5),n=2
- find_first_of ():从头开始,查找str里是否包含有子串中任何一个字符
- find_last_of ():从末尾处开始,向前查找是否包含有子串中任何一个字符。例:
string str("ABCDEFGABCD");
n=str.find_last_of("abcDefg");
//由于str末尾位置10是'D',所以n=10
n=str.find_last_of("abcDefg",5,4);
//等价于str.find_last_of("abcD",5),所以n=3
- find_first_not_of ():匹配子串任何一个字符,若某个字符不相等则返回str处的位置,全相等返回-1。
- find_last_not_of ():反向匹配子串任何一个字符,若某个字符不相等则返回str处的位置,全相等返回-1
例:
string str("ABCDEFGABCD");
n=str.find_last_not_of("aBDC");
//由于str位置7‘A',在子串里没有,所以n=7
替换
s.replace(n,l,str)
//从下标为n的位置,替换l个字节,为str
求子串(拷贝)
s.substr(n,l)
//提取s的子串,从下标n开始,长度为l
次常用函数
str1.clear();
//删除所有
str1.empty();
//判断为空, 为空返回true
str1.assign("ABC");
//清空str1串,然后设置str1串为"ABC",会重新释放分配字符串内存
str1.push_back ('A');
//在str1末尾添加一个'A'字符,参数必须是字符形式
str1.append ("ABC");
//在str1末尾添加一个"ABC"字符串,参数必须是字符串形式
str1.swap(str2);
//替换str1 和 str2 的字符串
s.compare() //前面减去后面的ASCII码,>0返回1,<0返回-1,相同返回0
其它
- 字符串的长度是另外保存的,这一点和c里的字符数组不一样。
如果没有长度,即使串中有内容,也不会输出。
#include
#include
#include
#include
#include
using namespace std;
string str;
char s[]="12345";
int main(){
str.reserve(5);//设置str的容量为5,不会填充数据.
for (int i=0;i<5;++i)
str[i]=s[i];
cout<<"str:"<
字符串的长度和容量是两个概念
前者用str.size()或str.length()获得
后者用str.capacity()获得,是指实际占内存的空间。以下两个函数可以改变字符串容量
str.resize(10);
//设置当前str的串容量,若设置大小大于当前串长度,则用字符‘\0’来填充多余的.
str.resize(10,char c);
//设置串容量,若设置大小大于当前串长度,则用字符c来填充多余的
str.reserve(10);
//设置str的串容量,不会填充数据.