|
C 語言使用字元陣列 (char [ ]) 表示字串,C 沒有字串運算子,大都靠函數處理字串。
C++ 增加 string 物件,也增加了字串運算子。
因此 C++ 有兩種字串模式:
(一) char 變數名[ ];
(二) std::string 變數名;
string 的命名空間為 std。
string 的宣告方式:如下表 string 建構子
char * 的宣告方式:
- char a[] = "ABCD";
- char a[5] = "ABCD";
- char a[] = {'A', 'B', 'C', 'D', 0};
- char a[5] = {'A', 'B', 'C', 'D', 0};
- char *a = "ABCD";
陣列宣告注意空間大小,不能小於實際字元數量,例如下面例子是錯的。
char a[3] = "ABCDEF";
C 語言字串格式,必須額外加入字串結尾字元 0。因此宣告空間大小必須是
實際字元數量 + 1。例如下面例子是錯的。
char a[5] = "ABCDE";
常用 char * 運算函數。
需 #include <string.h>
假設下面範例變數內容如下:
char a[] = "ABCDE" , b[] = "1234";
下面範例有些函數必須注意足夠空間才行,否則會有邏輯錯誤情形。
#include <string.h>
#include <stdlib.h>
char * 字串常用函數 |
語法 |
說明 |
結果運算元型態 |
int x = strlen(a); |
取得字串長度 |
x = 5 |
int x = strcmp(a,b); |
a 與 b 字串,一字一字(以 ASCII碼)比較,
當 a>b 傳回 1,a=b 傳回 0,a<b 傳回 -1 |
x = 1 |
char *p = strcpy(a , b); |
將 b 字串拷貝至 a。(a 的空間必須足夠容納 b)
並傳回 *a |
*p = "1234"
a[] = "1234" |
char *p = strncpy(a , b, 2); |
將 b 字串前 2 個字,拷貝至 a。(b 的空間必須足夠容納 a)拷貝後
若有多餘空間,必須維持不變。
並傳回 *a |
*p = "12CDE"
a[] = "12CDE" |
char *p = strcat(a , b); |
將 b 字串連接至 a 字串後面。(a 的空間必須足夠容納 a + b)
並傳回 *a |
*p = "1234"
a[] = "1234" |
char *p = strncat(a , b); |
將 b 字串拷貝至 a。(a 的空間必須足夠容納 b)
並傳回 *a |
*p = "1234"
a[] = "1234" |
char *p = strrev(a); |
將 a 字串反轉,並傳回 *a |
*p = "EDCBA"
a[] = "EDCBA" |
char *p = strlwr(a); |
將 a 字串轉小寫,並傳回 *a |
*p = "abcde"
a[] = "abcde" |
char *p = strupr(a); |
將 a 字串轉大寫,並傳回 *a |
*p = "ABCDE"
a[] = "ABCDE" |
設 a = "23.7";
float f = atof(a);
float d = atof("2xy"); |
將 a 字串轉成浮點數,並傳回。若字串中有非數字,則轉到非字串為止
,若字串中無數字,則傳回 0 |
f = 23.7
d = 2 |
設 a = "15";
int i = atoi(a); |
將 a 字串轉成浮點數,並傳回。若字串中有非數字,則轉到非字串為止
,若字串中無數字,則傳回 0 |
i = 15 |
char *p = gcvt(2.12345, 3, a); |
將浮點數四捨五入至第 3 位,並轉成字串放到陣列 a,且傳回 a 位址。
a 必須足夠空間容納。 |
a = "2.12"
p = "2.12" |
設 x = 48;
char c = (char) x; |
將整數 i 轉成相對應的 ASCII 字元 |
c = '0' |
設 c = '1';
int x = (int) c; |
將字元 c 轉成相對應的 ASCII 數值。 |
x = 49 |
n = 57
sprintf(s , "%d" , n); |
將整數值 n,轉成字串給 s |
s = "57" |
清除 a 字串的方法:
- a[0]=0;
- a[0]='\0';
- a[0]=NULL;
- strcpy(a , "");
下面範例假設
string a="ABCD", b="1234";
char c[]="XYZ", d[]="789";
string 運算子重載 |
運算子 |
語法 |
結果 |
運算元型態 |
+ |
a + b
|
"ABCD1234" |
string + string
|
a + c |
"ABCDXYZ" |
string + char*
|
c + a |
"XYZABCD" |
char* + string
|
a + 'K' |
"ABCDK" |
string + char |
'T' + a |
"TABCD" |
char + string |
== |
a == b |
false |
string 運算子 string
string 運算子 char*
char* 運算子 string |
!= |
a != b |
true |
< |
a < b |
false |
> |
a > b |
true |
<= |
a <= b |
false |
>= |
a >= b |
true |
string 建構子
假設 std::string a = "ABCDEF"
string 建構子 (物見宣告初值設定) |
宣告語法 |
變數內容 |
std::string x=""; |
x = "" |
std::string x (a);
|
x = "ABCDEF" |
std::string x (a , 2 , 3); |
x = "BCD" |
std::string x (a , 4); |
x = "ABCD" |
std::string x (5, 'T');
|
x = "TTTTT" |
std::string x (6, 48); // "0" 的 ASCII 為 48 |
x = "000000" |
std::string x (a.begin(), a.begin()+3); |
x = "ABC" |
下面範例假設
std::string a = "ABCDEF";
string::iterator 與 string::reverse_iterator 方法 |
語法 |
說明 |
結果運算元型態 |
std::string::iterator
p = a.begin() |
第一個字 |
*p = "A" |
std::string::iterator
p = a.end() |
最後字串結尾 (看不見) |
*p = "" |
std::string::reverse_iterator p = a.rbegin() |
最後第一個字 |
*p = "F" |
std::string::reverse_iterator p = a.rend() |
|
*p = "" |
下面範例假設
string a = "ABCDEFGH", t="XYZ", x;
char b[]="123456";
string 方法 |
語法 |
說明 |
結果 |
a.size() |
字串的字數 |
8 |
a.length()
|
同上 |
8 |
a.max_size()
|
能容納最大字元數 |
依機器能使用記憶體的大小而定 |
a.resize(a.size() + 3 , 'T')
a.resize(5) |
|
"ABCDEFGHTTT"
"ABCDE" |
a.capacity() |
容量 |
曾使用過的最大字數 |
a.clear() |
清除所有字元 |
a = "" |
a.empty() |
判斷是否為空字串 |
false |
a[2] |
a 的第 3 字元 |
'C' (註:c 從 0 開始算起) |
a.at(2) |
同上 |
同上 |
a.swap(t) //a只能 string
swap(a , t) //只能 string |
a、t 兩字串交換 |
a = "XYZ"
t = "ABCDEFGH"
|
x.assign(b);
x.assign(b,2,3);
x.assign(a);
x.assign(b,3);//b只能 char*
x.assign(4,'1');
x.assign(5,48); |
指定 b 給 x
指定 b 字串從第2 字連續3個字給 x
指定 a 給 x
指定 b 前 3 個字給 x
指定 4 個 '1' 給 x
指定 5 個 ASCII 為 48 的字給 x |
x = "123456"
x = "345"
x = "ABCDEFGH"
x = "123"
x = "1111"
x = "00000"
|
t.append(b);
t.append(b,2,3);
t.append(a);
t.append(b,3);//b只能 char*
t.append(4,'1');
t.append(5,48); |
附加 b 給 t
附加 b 字串從第2 字連續3個字給 t
附加 a 給 t
附加 b 前 3 個字給 t
附加 4 個 '1' 給 t
附加 5 個 ASCII 為 48 的字給 t |
t = "XYZ123456"
t = "XYZ345"
t = "XYZABCDEFGH"
t = "XYZ123"
t = "XYZ1111"
t = "XYZ00000" |
t.insert(1,a)
t.insert(1,a,1,2)
t.insert(1,b,1)
t.insert(1,b) //b只能 char*
t.insert(1,3,':')
t.insert(1,3,48) |
從 t 第 1 字開始插入 a 字串
從 t 第 1 字開始插入 a 字串 從第 1 字開始連續 2 個字
從 t 第 1 字開始插入 b 前 1 個字
從 t 第 1 字開始插入 b
從 t 第 1 字開始插入 3 個 ':'
從 t 第 1 字開始插入 3 個 ASCII 為 48 的字 |
t = "XYABCDEFGHZ"
t = "XYABZ"
t = "XY1Z"
t = "XY123456Z"
t = "XY:::Z"
t = "XY000Z" |
a.erase (2,3)//a只能 string |
a 從第 2 字開始連續刪除 3 個字 |
a = "ABFGH" |
a.replace(2,3,b)
a.replace(2,4,b,1,2)
a.replace(2,5,b,7)//b只能 char*
a.replace(2,2,4,'T')
a.replace(3,1,3,48) |
a 從第 2 字開始連續刪除 3 個字,此 3 字替換成 b
a 從第 2 字開始連續刪除 4 個字,此 4 字以 b 從第
1 字開始,連續 2 個字替換
a 從第 2 字開始連續刪除 5 個字,此 5 字以 b 前 7
字替換
a 從第 2 字開始連續刪除 2 個字,此 2 字以 4 個
'T' 替換
a 從第 3 字開始連續刪除 1 個字,此 1 字以 3 個
ASCII 碼為 48 的字替換 |
a = "AB123456FGH"
a = "AB23GH"
a = "AB123456 H" //不足補空白
a = "ABTTTTEFGH"
a = "ABC000EFGH" |
a.copy(b,2,3)//b 只能 char* |
從 a 字串第 3 字開始,連續複製 2 個字給 a
相當於 b.replace(0,2,a,3,2),但因 char 沒有 replace() |
b = "DE3456" |
a.find("CD")
a.find("CD",4)
a.find(b,5,2)//b 只能 char* |
在 a 字串中找尋 "CD",並傳回位置,找不到則傳回 -1
從 a 字串第 4 字開始尋找 "CD",並傳回位置,找不到
則傳回 -1
從 a 字串第 5 字開始尋找 b 字串的前 2 個字,並傳回
位置,找不到則傳回 -1
|
2
-1
-1 |
a.rfind("CD") |
同 a.find("CD") |
2 |
x = a.substr(3)
x = a.substr(2, 4) |
取得 a 從第 3 字開始直到最後一個字。
取得 a 字串,從第 2 字開始,連續 4 個字。 |
x = "DEFFG"
x = "CDEF" |
假設 std::string b="ABCDE";
a.compare(b)
a.compare(2,3,"CDE")
a.compare(4,4,b,1)
a.compare(2,6,b,2,2) |
字串比對必須從第 1 個字比到最後一個字,不同者:
若被比較字的 ASCII > 比較字的 ASCII 傳回1,
否則傳回
-1,相同者:傳回兩字串長度差。
a 與 b 比對。
a 的第 2 字開始,連續 3 個字與 "CDE" 比對。
a 的第 4 字開始,連續 4 個字與 b 的前 2 個字比對。
a 的第 1 字開始,連續 3 個字與 b 的第 1 字開始,
連續 4 個字比對。 |
3
0
-1
|
getline (std::cin , a); |
從鍵盤整行輸入(也就是直到按 Enter) 字串至 變數 a |
|
std::cout << a; |
輸出字串 a。 |
|
std::cin >> a; |
輸入字串至 a。(以空白或按 Enter 隔開資料) |
|
|