C++ Primer Plus書之--C++字串
首先類似c語言裡的字串:
// 陣列長度11實際上已經把字串結尾的\0字元考慮進去了
char bird[11] = "Mr. Cheeps";
// 讓編譯器自己判斷字串的長度
char fish[] = "Bubbles";
假如有如下程式碼:
char boss[8] = "Bozo";
雖然長度是8實際上之後前五位有效也就是B,o,z,o,\0(表示字串結尾)這五位後三位預設都是\0
注意's' 和 "s" 是不一樣的前者便是字元s(ASCII碼為83), 後者表示的是兩個字元's'和'\0'組成的字串
拼接字串常量
c++裡允許兩個用引號括起來的字串合併為一個, 也就是中間由空白(空格, 製表符, 換行符)連結的兩個字串都可以合成一個, 看如下程式碼:
#include "iostream"
using namespace std;
int main() {
cout << "one two three" " four five six." << endl;
cout << "one two three four five six." << endl;
cout << "one two thre"
"e four five six." << endl;
}
看執行結果:
從執行結果可以看得出來, c++在拼接字串的時候不會在兩個字串之間新增空格, 第二個字串的第一個字元會佔據第一個字串的結束標記也就是\0, 也就是第二個字串會緊跟著第一個字串並從第一個字串的\0字元開始拼接
看一下下面這段程式碼的執行:
#include "iostream" #include "cstring" using namespace std; int main() { const int Size = 2; char name1[] = "JackTom"; cout << "sizeof name1 = " << sizeof(name1) << endl; cout << "strlen of name1 = " << strlen(name1) << endl; cout << "name1 = " << name1 << endl; char name2[Size]; cout << "Please input your name : " << endl; cin >> name2; cout << "your input name is : " << name2 << endl; cout << "sizeof name2 = " << sizeof(name2) << endl; cout << "strlen of name2 = " << strlen(name2) << endl; cout << "========" << name2[2] << endl; char name3[] = "Tom"; cout << sizeof(name3) << " len : " << strlen(name3) << endl; cout << " name3[4] = " << name3[4] << endl; cout << " name3[4] = " << int(name3[4]) << endl; }
執行結果如下:
從執行結果看出雖然name2我宣告的是長度為2的char型陣列, 但是我複製了很長的字串也沒有發生陣列越界的問題, 感覺應該是因為char陣列 只是類似一個char* 所以如果沒有遇到\0就不當做字串結束
c++裡有string類, 提供了對字串的更方便的使用
在使用string類的時候需要引入string標頭檔案在程式開頭寫:
#include "string"
宣告一個string型別的變數方式如下:
string s1 = "one"; // 宣告並初始化
string s2, s3; // 僅宣告, 沒有初始化
string型別的變數可以直接賦給另一個string變數例如:
s2 = s1; // 這時候s2 也是"one" 了
此外string型別的變數可以有類似java裡的操作:
s3 = s1 + s2; // 可以把s1和s2拼接起來賦給s3
s1 += s2; // 可以吧s1和s2拼接起來再賦給s1
在我們計算字串的長度的時候, 需要分清楚是c語言型別的字串還是c++裡的string類物件的字串例如:
char str_c[] = "hello world";
string str_cpp = "hello c++";
他們使用的方法使不一樣的, 分別是:
int len1 = strlen(str_c);
int len2 = str_cpp.size();