參考自: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ù).