C 語言使用字元陣列 (char [ ]) 表示字串,C 沒有字串運算子,大都靠函數處理字串。
C++ 增加 string 物件,也增加了字串運算子。
因此 C++ 有兩種字串模式:
(一) char 變數名[ ];
(二) std::string 變數名;

string 的命名空間為 std。
string 的宣告方式:如下表 string 建構子

char * 的宣告方式:
  1. char a[] = "ABCD";
  2. char a[5] = "ABCD";
  3. char a[] = {'A', 'B', 'C', 'D', 0};
  4. char a[5] = {'A', 'B', 'C', 'D', 0};
  5. 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 字串的方法:

  1. a[0]=0;
  2. a[0]='\0';
  3. a[0]=NULL;
  4. 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 隔開資料)