2017/3/7

C++ 字串

C++字串本質是由字元所組成的陣列,並在最後加上一空字元'\0'
char str[] = {'h', 'e', 'l', 'l', 'o', '\0'};
它是用空字元來識別一陣列是否為字串
輸出:cout << str << endl;


也可這樣宣告
char str[] = "hello";

就算不加空白字元,它也會幫你加上
int main() { 
    char str[] = "hello"; 
    for(int i = 0; i < (sizeof(str)/sizeof(str[0])); i++) { 
        if(str[i] == '\0') 
            cout << " null"; 
        else 
            cout << " " << str[i]; 
    } 
    cout << endl; 
    return 0; 
}
執行結果:h e l l o null
(sizeof(str)/sizeof(str[0]))會回傳6

取得使用者輸入的字串
char str[80];
cout << "輸入字串:";
cin >> str;
cout << "您輸入的字串為 " << str << endl;

指定新字串要一個個指定
char str[80] = {'\0'};
str[0] = 'J';
str[1] = 'u';
str[2] = 's';
str[3] = 't';
str[4] = '\0';
cout << str << endl;

不能這樣
char str[80];
str = "Just";

上面這樣很麻煩,所以C++有提供函式
strcpy(str1, str2); // str2字串複製給str1字串
strcat(str1, str2); // str2字串串接在str1字串後
strlen(str); // 計算不含空字元的字串長度
strcmp(str1, str2); // 比較兩個字串
使用前,請加上#include <cstring>

#include <iostream> 
#include <cstring> 
using namespace std; 

int main() { 
    char str1[80] = {'\0'}; 
    char str2[] = "caterpillar"; 

    cout << "str1: " << str1 << endl
         << "str2: " << str2 << endl
         << endl; 

    // 將str2複製給str1 
    strcpy(str1, str2); 
    cout << "str1: " << str1 << endl
         << "str2: " << str2 << endl
         << endl;

    // 將str2接在str1後 
    strcat(str1, str2); 
    cout << "str1: " << str1 << endl
         << "str2: " << str2 << endl
         << endl;

    cout << "str1長度:" << strlen(str1) << endl
         << "str2長度:" << strlen(str2) << endl
         << endl;

    cout << "str1與str2比較:" << strcmp(str1, str2) << endl
         << endl;
 
    return 0; 
}
執行結果:
str1:
str2: caterpillar

str1: caterpillar
str2: caterpillar

str1: caterpillarcaterpillar
str2: caterpillar

str1長度:22
str2長度:11

str1與str2比較:1

strcmp(str1, str2)會比較兩字串大小,相同傳0,不同傳1(不知為何我strcmp在Netbeans上會傳回48、-99這些奇怪的值...原因有待釐清.....)
strlen()傳回的不包含空字元

gets()函式可取得包括空白的字串
#include <iostream>
#include <stdio.h>
using namespace std;
int main(){
    char str[80];
    cout << "輸入字串:";

    gets(str);
    cout << "輸入的字串:" << str << endl;
    return 0;
}
使用前記得引入#include <stdio.h>

以下寫法會錯誤
char str1[] = "text1";
char str2[] = "text2";
str1 = str2; // error
cout << str1 + str2 << endl; // error

最好使用C++提供的string類別來操作字串,要引入#include <string>
現在有三種方法:
string str1; // 建立一個string物件,內容為空字串
string str2("caterpillar"); // 以字串常量建立字串
上面那行也可以這樣寫string str1 = "caterpillar";
string str3(str2); // 以string實例建立字串
str3是把str2的內容複製給str3,並建立一個新實例

現在可以這樣做:
#include <iostream> 
#include <string>
using namespace std;
int main() {
    string str1;
    string str2("caterpillar");
    string str3(str2);

    if(str1.empty()) {
        cout << "str1 為空字串" << endl;
    }
    cout << "str1 長度: " << str1.size() << endl;
    cout << "str2 長度: " << str2.size() << endl;
    cout << "str3 長度: " << str3.size() << endl;
    if(str1 == str2) {
        cout << "str1 與 str2 內容相同" << endl;
    }
    if(str3 == str2) {
        cout << "str3 與 str2 內容相同" << endl;
    }
    return 0;
}
執行結果:
str1 為空字串
str1 長度: 0
str2 長度: 11
str3 長度: 11
str3 與 str2 內容相同

現在可以這樣寫:
string str1("text1");
string str2("text2");
....
str1 = str2;

也可把字元陣列內容複製給字串實例
string name("caterpillar");
char str[] = "justin";
name = str;

但反過來不行
char str[] = "justin";
string name("caterpillar");
str = name; // error

可直接+串接字串
str1 = str1 + str2;
str1 = str1 + "\n";

也可向操作陣列元素那樣:
#include <iostream> 
#include <string> 
using namespace std; 
int main() { 
    string name("caterpillar");
    for(int i = 0; i < name.size(); i++) {
        cout << name[i] << endl;
    }
    return 0; 
}
執行結果:
c
a
t
e
r
p
i
l
l
a
r
下面是string類別常用的方法
#include <iostream> 
#include <string> 
using namespace std; 

int main() { 
    string str1; 
    string str2("caterpillar"); 
    string str3(str2); 

    // assign: 指定字串 
    str1 = str1.assign(str2, 0, 5); 
    cout << "str1: " << str1 << endl; 
    str1 = str1.assign("caterpillar", 5, 6); 
    cout << "str1: " << str1 << endl; 

    str1 = ""; 

    // append: 字串串接 
    str1 = str1.append(str2, 0, 5); 
    str1 = str1.append(str3, 5, 6); 
    cout << "str1: " << str1 << endl; 

    // find: 尋找字串位置 
    cout << "尋找str1中的第一個pill: " 
         << str1.find("pill", 0) << endl; 

    // insert: 插入字串 
    cout << "在str1插入字串***: " 
         << str1.insert(5, "***") << endl; 

    cout << "str1長度: " << str1.length() << endl; 
    return 0; 
}
執行結果:
str1: cater
str1: pillar
str1: caterpillar
尋找str1中的第一個pill: 5
在str1插入字串***: cater***pillar
str1長度: 14
下面是簡單的說明: 
方 法說 明
assign(string, start, num)從string的第start個字元取出num個字元來指定給另一字串物件。
append(string, start, num)從string的第start個字元取出num個字元來附加至另一字串物件之後。
find(string, 0)從引發find的字串物件第0個字元尋找是否有符合string的子字串。
insert(start, string)將string插入引發insert的字串物件第start個字元之後。
length()傳回字串的長度。

沒有留言:

張貼留言