1、字符串是用字符型數組存儲的,字符串要求其尾部以’\0’作為結束標志。如:
char string[ ]=”C++ programming language”;
用sizeof來測string長度為25個字節,而實際串本身長度(含空格)為24個字節,多出來的一個就是串結束符’\0’(含0)。
2、指針與字符串:
char *pstr=”C++ is a object_oriented language”;
這里絕不是建立了一個字符串*pstr,并用賦值號后的字符串常量給它賦初值。而是編譯器將字符串常量“C++ is a object language”的第一個字符的存儲地址賦給字符指針作初值。字符串常量是放在字符串常量區中,它不屬于指針pstr,反過來是pstr依附于它。
用指針輸出字符串:
C++不對數組的邊界進行檢測,但字符串有一個結束符’\0’(全0),在程序運行時是可以知道實際串長度的。設有定義int a[10],如有語句: cout<<a<<endl;
則打印出a數組在內存中的首地址,一個16進制的數。
3、字符串處理函數:
C++標準庫有很多字符串處理函數,在頭文件<cstring>中。
1)字符串復制函數:char *strcpy(char *s,const char ct)
返回值是指向復制后字符串中首字符的指針。
【例5.10】字符串復制函數 strcpy() 。
2)串連接函數:char *strcat(char *s,const char *ct)
將串ct復制到串s的后面,形成一個長串。例如:
char str1[30]=“張成”;
char str2[20]=“是電子系的學生”;
strcat(str1,str2);
結果是str1中放的是“張成是電子系的學生”。
3)字符串比較函數:int strcmp(const char *cs,const char ct)。
兩字符串比較是按字典排序方法進行。兩個字符串從第一個字符比較起,如果相同,則比較第二個字符,依此類推,直到不同。哪個字符串對應的字符的ASCII碼值大,串就大。如果兩串直到結束符都相同,則一樣大。若兩個字符串相等,則返回0;串cs 大,則返回正整數;串ct大,則返回負整數。
該函數也可很簡潔地表達如下:
int strcmp(const char *cs,const char *ct){
int k;
while((k= *cs - * ct)== 0 && *cs++ && *ct++);
//注意*cs++和*ct++是條件判斷后才++的
return k;}
4)求字符串長度函數:int strlen(const char *s)
這里求出的串長度不包含串結束符在內。而sizeof運算符包括結束符,還包括沒有使用的單元。
4、void指針及應用:稱無類型或泛型指針。
任何類型的指針都可以賦給void類型的指針變量,例如:
int val=5;
int *pi=&val; //必須為指針賦一個有效地址,才能引用指針
void *pv=pi;
但反過來,將泛類型指針賦給其他類型指針必須使用強制類型轉換: pi=(int *)pv;
【例5.11】將字符指針強制轉換為泛型指針輸出字符串地址。
標準的C++string類
1、建議使用C++的string類,它重載了運算符,連接、索引和復制等操作不必使用函數,使運算更加方便,而且不易出錯。string類包含在名字空間std中的頭文件<string>。
#include<string>
using namespace std;
2、string類的使用方法:
(1) string類有三個構造函數:
string str; //調用默認的構造函數,建立空串
string str("OK"); //調用采用C字符串初始化的構造函數
string str(str1); //調用復制構造函數,str是str1的復制
(2) string類字符元素的訪問比C字符串有所增強:
str[i] //返回str中索引i處字符的引用,不查是否出界
str.at(i) //返回str中索引i處字符的引用,查是否出界
(3) string類重載了一些運算符,特別注意當目標串較小,無法容納新的字符串,系統會自動分配更多的空間給目標串,不必顧慮出界:
str1=str2; //str1成為str2的代碼
str1+=str2; //str2的字符數據連接到str1的尾部
str1+str2; //返回一個字符串,它將str2連接到str1的尾部
str1==str2; str1!=str2; //比較串是否相等,返回布爾值
str1<str2; str1>str2; str1<=str2; str1>=str2;
//基于字典序的比較,返回布爾值
(4) string類的輸入輸出。
輸出與C風格字符串同樣方便,使用插入運算符<<和cout。輸入如用提取運算符>>,代碼讀取的是以空白字符結束的字符串,輸入完整的字符串可用非成員函數getline,注意格式:
getline(cin,str); //串以’\n’結束
getline(cin,str,ch); //串以ch結束
(5) string類有一些常用的成員函數可進行字符串處理:
str.substr(pos,length1); //返回對象的一個子串,從pos位置起,長length1個字符
str.empty(); //查是否空串
str.insert(pos,str2); //將str2插入str的pos位置處
str.remove(pos,length1); //在str位置pos處起,刪除長度為length1的字串
str.find(str1); //返回str1首次在str中出現時的索引
str.find(str1,pos); //返回從pos處起str1首次在str中出現時的索引
str.length(str); //返回串長度
(6) C字符串到string類對象是由構造函數隱式自動進行,而string類對象到C字符串的轉換必須執行顯示的類型轉換,應調用成員函數
str.c_str(); //將string類轉換為C風格字符串,返回char*
3、【例5.12】判斷字符串是否為回文。
回文是指順讀和反讀都一樣的串,這里不分大小寫,并濾去所有非字母字符,如:
Madam,I’m Adam.
Golf,No Sir,prefer prison flog
都是回文。
string類有自己的構造函數和析構函數,如果它作為類或結構的成員,要記住它是成員對象,當整個類對象建立和撤銷時,會自動調用作為成員對象的string字符串的構造和析構函數。