字符串與字符數(shù)組

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

帶空格的字符數(shù)組整行讀入

  • gets(s); 注意:有些評測系統(tǒng)會出錯须揣。
  • cin.getline(s,l);

帶空格的字符串整行讀入

  • getline(cin,str);

字符串操作

  • 反轉(zhuǎn)字符串
    通過<algorithm>里的reverse實現(xiàn)
string str("hello");
reverse(str.begin(),str.end());
cout<<str<<endl;              
//反轉(zhuǎn)自身字符串,打印olleh
//以下為字符數(shù)組版
char str[]="hello";
reverse(str,str+strlen(str));
cout<<str<<endl; 

字符數(shù)組

  • 字符數(shù)組的相關(guān)函數(shù)

    • 求長度
    strlen(s)   //求s的長度('\0'不算在內(nèi))
    
    • 復(fù)制
    strcpy(s1,s2)       //將s2復(fù)制到s1(原s1清除)
    strncpy(s1,s2,n)    //將s2的前n個字符復(fù)制到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個數(shù)字復(fù)制到s1中
    
    • 增加
    strcat(s1,s2)       //將s2增加到s1后面,返回s1首地址
    strncat(s1,s2,n)    //將s2的前n個字符增加到s1后面
    
    • 大小寫轉(zhuǎn)換
    strlwr(s)   //將s中大寫字母轉(zhuǎn)換成小寫字母
    strupr(s)   //將s中小寫字母轉(zhuǎn)換成小寫字母
    //注:strupr不是標(biāo)準(zhǔn)C庫函數(shù),只能在VC中使用鲤竹。在linux gcc環(huán)境下需要自行定義這個函數(shù)箫老。
    
    • 比較
    strcmp(s1,s2)   //如果s1>s2,返回正數(shù)
            //如果s1=s2逞怨,返回0
            //如果s1<s2者疤,返回負(fù)數(shù)
    strncmp(s1,s2,n)    //比較s1和s2的前n個字符
    
    • 查找
    strspn(str1,str2)   //統(tǒng)計str1中在str2出現(xiàn)過的字符數(shù)
    strcspn(str1,str2)  //統(tǒng)計str1中沒在str2出現(xiàn)過的字符數(shù)
    strstr(str1,str2)   //在str1中查找str2第一次出現(xiàn)的位置(地址)
    strchr(str,ch)      //返回ch在str中第一次出現(xiàn)的位置
        //如果沒有找到返回NULL,即0000000000000000(空地址)
    strrchr(str,ch)     //返回ch在str中最后一次出現(xiàn)的位置
    
    • 字符數(shù)組與數(shù)的轉(zhuǎn)換
    sscanf(s,"%d",&n)   //將字符數(shù)組S轉(zhuǎn)換成數(shù)字n
    sprintf(s,"%d",N)   //將數(shù)字n轉(zhuǎn)換成字符數(shù)組S
    int n=atoi(s)       //將s按十進(jìn)制轉(zhuǎn)換成數(shù)字返回
    

字符串(string類)

string類常用的構(gòu)造函數(shù)

string str;  
//生成一個空字符串
string str ("ABC")  
//等價于 str="ABC"
string str ("ABC", strlen)  
// 將"ABC"存到str里,最多存儲前strlen個字節(jié)
string s("ABC",stridx,strlen)   
//將"ABC"的stridx位置,做為字符串開頭,存到str里.且最多存儲strlen個字節(jié).
string s(strlen, 'A')  
//存儲strlen個'A'到str里

字符串轉(zhuǎn)字符數(shù)組常量

  • 函數(shù)c_str()叠赦,【返回常量】
    返回一個常量C字符串, 內(nèi)容與本string串相同驹马。當(dāng)本string的內(nèi)容改變或被析構(gòu)后,返回的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;
}
//運行結(jié)果 
//&s=00000000002f7ec8,&str=00000000002f7e90
//ABCD
//ABCD
//ABCD
  • 函數(shù)data()糯累,【返回常量】
    用法同c_str()
const char *s1= str.data();   //將string類轉(zhuǎn)為字符串?dāng)?shù)組,返回給s1
  • 函數(shù)copy()算利,【通過參數(shù)帶回到變量】
    str.copy(s,count,pos); 將str里的pos位置開始,拷貝count個字符,存到s里.
string str("ABCDEFGABCD"); 
char *s=new char[10];
str.copy(s,5,2);   //s帶回“CDEFG"

常用函數(shù)

插入
s.insert(n,str)
//在s的下標(biāo)為n的位置,插入str
刪除
//string str="ABCD";
s.erase(n)
//刪除下標(biāo)n及以后的內(nèi)容
//比如: str.erase(2);即"ABCD" --> "AB"
s.erase(n,l)
//從下標(biāo)為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)
//從下標(biāo)為n的位置,替換l個字節(jié),為str
求子串(拷貝)
s.substr(n,l)
//提取s的子串朦蕴,從下標(biāo)n開始篮条,長度為l

次常用函數(shù)

str1.clear();              
//刪除所有
str1.empty();            
//判斷為空, 為空返回true
str1.assign("ABC");        
//清空str1串,然后設(shè)置str1串為"ABC",會重新釋放分配字符串內(nèi)存

str1.push_back ('A');      
//在str1末尾添加一個'A'字符,參數(shù)必須是字符形式
str1.append ("ABC");       
//在str1末尾添加一個"ABC"字符串,參數(shù)必須是字符串形式
     
str1.swap(str2);              
//替換str1 和 str2 的字符串
s.compare() //前面減去后面的ASCII碼吩抓,>0返回1涉茧,<0返回-1,相同返回0

其它

  • 字符串的長度是另外保存的疹娶,這一點和c里的字符數(shù)組不一樣伴栓。
    如果沒有長度,即使串中有內(nèi)容雨饺,也不會輸出挣饥。
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
string str;
char s[]="12345";
int main(){
    str.reserve(5);//設(shè)置str的容量為5,不會填充數(shù)據(jù).
    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;
}
//運行結(jié)果 
//str:
//length():0
//capacity():5

//原因:使用for循環(huán)拷貝,僅改變了str的串內(nèi)容沛膳,并沒有改變str的length長度 
  • 字符串的長度和容量是兩個概念
    前者用str.size()或str.length()獲得
    后者用str.capacity()獲得,是指實際占內(nèi)存的空間。

  • 以下兩個函數(shù)可以改變字符串容量

str.resize(10);           
//設(shè)置當(dāng)前str的串容量,若設(shè)置大小大于當(dāng)前串長度,則用字符‘\0’來填充多余的.
str.resize(10,char c);     
//設(shè)置串容量汛聚,若設(shè)置大小大于當(dāng)前串長度,則用字符c來填充多余的
str.reserve(10);         
//設(shè)置str的串容量,不會填充數(shù)據(jù).
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锹安,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌叹哭,老刑警劉巖忍宋,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異风罩,居然都是意外死亡糠排,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門超升,熙熙樓的掌柜王于貴愁眉苦臉地迎上來入宦,“玉大人,你說我怎么就攤上這事室琢∏颍” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵盈滴,是天一觀的道長涯肩。 經(jīng)常有香客問我,道長巢钓,這世上最難降的妖魔是什么病苗? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮症汹,結(jié)果婚禮上硫朦,老公的妹妹穿的比我還像新娘。我一直安慰自己烈菌,他們只是感情好阵幸,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著芽世,像睡著了一般挚赊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上济瓢,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天荠割,我揣著相機(jī)與錄音,去河邊找鬼旺矾。 笑死蔑鹦,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的箕宙。 我是一名探鬼主播嚎朽,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼柬帕!你這毒婦竟也來了哟忍?” 一聲冷哼從身側(cè)響起狡门,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锅很,沒想到半個月后其馏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡爆安,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年叛复,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扔仓。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡褐奥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出当辐,到底是詐尸還是另有隱情抖僵,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布缘揪,位于F島的核電站耍群,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏找筝。R本人自食惡果不足惜蹈垢,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望袖裕。 院中可真熱鬧曹抬,春花似錦、人聲如沸急鳄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疾宏。三九已至张足,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坎藐,已是汗流浹背为牍。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留岩馍,地道東北人碉咆。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像蛀恩,于是被迫代替她去往敵國和親疫铜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351