C++ string獲取字串元素:[]和at()

2020-07-16 10:04:38
在通常情況下,string 是 C++ 中的字串。字串是一種特殊型別的容器,專門用來操作字元序列。

字串中元素的存取是允許的,一般可使用兩種方法存取字串中的單一字元:下標操作符[] 成員函數at()兩者均返回指定的下標位置的字元。第 1 個字元索引(下標)為 0,最後的字元索引為 length()-1。

需要注意的是,這兩種存取方法是有區別的:
  • 下標操作符 [] 在使用時不檢查索引的有效性,如果下標超出字元的長度範圍,會示導致未定義行為。對於常數字串,使用下標操作符時,字串的最後字元(即 '')是有效的。對應 string 型別物件(常數型)最後一個字元的下標是有效的,呼叫返回字元 ''。
  • 函數 at() 在使用時會檢查下標是否有效。如果給定的下標超出字元的長度範圍,系統會丟擲 out_of_range 異常。

【例 1】
#include <iostream>
#include <string>
int main()
{
    const std::string cS ("c.biancheng.net");
    std::string s ("abode");
    char temp =0;
    char temp_1 = 0;
    char temp_2 = 0;
    char temp_3 = 0;
    char temp_4 = 0;
    char temp_5 = 0;
    temp = s [2]; //"獲取字元 'c'
    temp_1 = s.at(2); //獲取字元 'c'
    temp_2 = s [s.length()]; //未定義行為,返回字元'',但Visual C++ 2012執行時未報錯
    temp_3 = cS[cS.length()]; //指向字元 ''
    temp_4 = s.at (s.length ()); //程式異常
    temp_5 = cS.at(cS.length ()); //程式異常
    std::cout << temp <<temp_1 << temp_2 << temp_3 << temp_4 << temp_5 << std::endl;
    return 0;
}
通過對上述程式碼的分析可知,要理解字串的存取需要多實踐、多嘗試,並且要牢記基礎知識和基本規則。

為修改 string 字串的內容,下標操作符 [] 和函數 at() 均返回字元的“參照”。但當字串的記憶體被重新分配以後,可能會發生執行錯誤。

【例 2】
#include <iostream>
#include <string>
int main()
{
    std::string s ("abode");
    std::cout << s << std::endl ;
    char& r = s[2] ; //建立參照關係
    char*p=&s[3]; //建立參照關係
    r='X' ;//修改內容
    *p='Y' ;//修改內容
    std::cout << s << std::endl; //輸出
    s = "12345678"; //重新賦值
    r ='X'; //修改內容
    *p='Y'; //修改內容
    std::cout << s << std::endl; //輸出
    return 0;
}
程式輸出結果為:

abode
abXYe
12XY5678

在例 2 中,使用 Visual C++ 2012 編譯器編譯,字串被重新賦值後,修改其中某位置字元的值,仍然成功。這與前面所述的“可能會發生執行錯誤”其實並不矛盾。因為,從意義上講,字串被重新賦值後,只是其原來的參照關係已經沒有意義了。