溫故而知新。
C++語言中的字符串有兩種形式:一種就是用字符數組表示字符串,一種就是用標準庫中string來定義字符串。
這節主要講述C語言中字符數組的用法。
一 字符常量
1.1 普通的字符常量
用單撇號括起來的一個字符就是字符常量。如'a','#','%','D'.
注意:
- 字符常量只包括一個字符
- 字符常量區分大小寫字母
- 撇號是定界符,而不屬於字符串常量的一部分
1.2 轉義字符常量
是一種特殊形式的字符常量,就是以'\'開頭的字符序列。
常見的"\"開頭的特殊字符見下表:
之所以稱爲轉義字符,意思是將反斜槓(\)後面的字符轉換成另外的意義。
轉義字符雖然包含兩個或多個字符,但它只代表一個字符。編譯系統在見到字符"\"時,會接着找它後面的字符,把它處理成一個字符,在內存中只佔一個字節。
1.3 字符數據的存儲形式
將一個字符常量存放到內存單元時,實際上並不是把該字符本身放到內存單元中去,而是將該字符相應的ASCII代碼放到存儲單元中。
既然字符數據以ASCII碼存儲的,它的存儲形式就與整形的存儲形式類似。這樣C++中字符型數據和整形數據就可以通用。一個字符數據可以賦值給一個整形變量,一個整形數據也可以賦值給一個字符變量。也可以對字符數據進行算術運算,此時相當於對它們的ASCII碼進行算術運算。
注意:字符數據只佔一個字節,它只能存放0-255範圍內的整數。
#include<iostream>
using namespace std;
int main()
{
char c1,c2;
c1='a';
c2='b';
c1=c1-32;
c2=c2-32;
cout<<c1<<' '<<c2<<endl;
return 0;
}
執行結果:
A B
1.4 字符串常量
用雙撇號括起來的字符就是字符串常量,如"abc","hello!"。
編譯系統會在字符串最後自動加一個"\0"作爲字符串結束標誌。但"\0"並不是字符串的一部分,他只是作爲字符串的結束標誌。
注意:"a"和'a'代表不同的含義,"a"是字符串常量,'a'是字符常量。前者佔兩個字節,後者佔1個字節。
二 字符數組
1.1 定義和 初始化字符數組
(1)先定義再初始化
char c[6];
c[0] = 'H';
c[1] = 'e';
c[2] = 'l';
c[3] = 'l';
c[4] = 'o';
(2)定義時初始化
char c[6] = { 'H','e','l','l','o'};
或者直接用字符串常量初始化字符數組。這種方法更加直觀,方便,符合人們的習慣。
char c[6] = "Hello";
又或者省略字符串的長度,系統會根據初值的個數確定數組長度。
char c[] = "Hello";
也可以初始化一個二維字符數組,如
char diamond[5][5] = { {' ',' ','*'},{' ','*',' ','*'},{'*',' ',' ',' ','*'},
{ ' ','*',' ','*' },{' ',' ','*'} };
1.2 賦值和引用
只能對字符數組的元素賦值,而不能用賦值語句對整個數組賦值。如:
char c[5];
c = { 'H','e','l','l','o' }; //錯誤
c[0] = 'H';c[1] = 'e';c[2] = 'l';c[3] = 'l';c[4] = 'o'; //正確
如果已經定義了a和b是具有相同類型和長度的數組,且b數組已經被初始化,則:
a = b; //錯誤,不能對整個數組整體賦值
a[0] = b[0]; //正確,引用數組元素
1.3 字符串結束標誌
C++規定了一個"字符串結束標誌",以字符'\0'代表。
遇到字符'\0'就表示字符串到此結束,由它前面的字符組成有效字符串。
在程序中往往依靠檢測'\0'的位置來判定字符串是否結束,而不是根據數組的長度決定字符串的長度。
需要說明的是:字符數組並不要求它的最後一個字符必須是'\0',甚至可以不包含'\0'。
char str[5] = { 'C','h','i','n','a' };
是否需要加'\0',完全根據程序的需要決定。
1.4 字符數組的輸入輸出
有兩種方法:
(1)逐個字符輸入輸出;
(2)將整個字符串一次輸入或輸出。
例如:
char str[20];
cin >> str;
cout << str;
注意:
(1)輸出的字符不包括結束符'\0'
(2)輸出字符串時,cout流中用字符數組名,而不是數組元素名。如:
cout << str;
cout << str[4];
(3)如果數組長度大於字符串實際長度,輸出遇'\0'結束。
(4)如果一個字符數組包含一個及其以上'\0',則遇第一個'\0'時輸出結束。
(5)用cin從鍵盤向計算機輸入一個字符串時,從鍵盤輸入的字符應短於已定義的字符數組的長度。
C++提供cin流中的getline函數,用於讀入一行字符。
1.5 字符串處理函數
(1)字符串連接函數
strcat(char[], const char[]);
作用:將第2個字符數組中的字符串連接到前面字符數組的字符串的後面。
第二個字符數組被聲明爲const,以保證內容不會被修改。
(2)字符串複製函數
strcpy(char[], const char[]);
作用:將第2個字符數組中的字符串複製到第1個字符數組中去。
說明:
a. 在調用strcpy函數時,第一個實參必須是數組名,第二個實參可以是字符數組名,也可以是一個字符串常量。如
strcpy(str1,"China");
b. 可以用strcpy函數將一個字符串前若干字符複製到一個字符數組中去。
strcpy(str1,str2,2); //僅複製前兩個字符
c. 只能通過調用strcpy函數來實現將一個字符串賦給一個字符數組,而不能用賦值語句將一個字符串常量或字符數組直接賦值給一個字符數組。
str1 = "China"; //錯
str1 = str2; //錯
(3)字符串比較函數
strcmp(const char[], const char[]);
作用:比較兩個字符串。
a. 如果字符串1等於字符串2,函數值爲0。
b. 如果字符串1大於字符串2, 函數值爲一正整數。
c. 如果字符串1小於字符串2,函數值爲一負整數。
對兩個字符串自左至右逐個字符相比,直到遇到不同的字符。
1.6 字符串長度函數
strlen(const char[]);
函數值爲字符串的實際長度,不包括'\0'在內。