字符串与字符数组

参考自:https://www.cnblogs.com/lifexy/p/8642163.html(未整理完)

带空格的字符数组整行读入

  • gets(s); 注意:有些评测系统会出错。
  • cin.getline(s,l);

带空格的字符串整行读入

  • getline(cin,str);

字符串操作

  • 反转字符串
    通过<algorithm>里的reverse实现
string str("hello");
reverse(str.begin(),str.end());
cout<<str<<endl;              
//反转自身字符串,打印olleh
//以下为字符数组版
char str[]="hello";
reverse(str,str+strlen(str));
cout<<str<<endl; 

字符数组

  • 字符数组的相关函数

    • 求长度
    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<<s1<<endl;
      cout<<s2<<endl;
      return 0;
    }
    //输出:123def
    //    1234
    
    //举例:
    strncpy(s1,string+12,13)   
    //将string中从string[12]开始的13个数字复制到s1中
    
    • 增加
    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<s2,返回负数
    strncmp(s1,s2,n)    //比较s1和s2的前n个字符
    
    • 查找
    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 <iostream>
#include <cstdio>
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<<s<<endl; 
    str->append("EF");
    cout<<s<<endl;
    delete str;
    cout<<s<<endl;
    return 0;
}
//运行结果 
//&s=00000000002f7ec8,&str=00000000002f7e90
//ABCD
//ABCD
//ABCD
  • 函数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 <iostream>
#include <iomanip>
#include <cstdio>
#include <cstring>
#include <algorithm>
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<<endl;
    cout<<"length():"<<str.length()<<endl; 
    cout<<"capacity():"<<str.capacity()<<endl;
    return 0;
}
//运行结果 
//str:
//length():0
//capacity():5

//原因:使用for循环拷贝,仅改变了str的串内容,并没有改变str的length长度 
  • 字符串的长度和容量是两个概念
    前者用str.size()或str.length()获得
    后者用str.capacity()获得,是指实际占内存的空间。

  • 以下两个函数可以改变字符串容量

str.resize(10);           
//设置当前str的串容量,若设置大小大于当前串长度,则用字符‘\0’来填充多余的.
str.resize(10,char c);     
//设置串容量,若设置大小大于当前串长度,则用字符c来填充多余的
str.reserve(10);         
//设置str的串容量,不会填充数据.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352