字符串与字符数组

参考自: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的串容量,不会填充数据.

你可能感兴趣的:(字符串与字符数组)