c++ 大大增強了對字串的支援,除了可以使用c風格的字串,還可以使用內建的 string 類。string 類處理起字串來會方便很多,完全可以代替c語言中的字元陣列或字串指標。
string 是 c++ 中常用的乙個類,它非常重要,我們有必要在此單獨講解一下。
使用 string 類需要包含標頭檔案,下面的例子介紹了幾種定義 string 變數(物件)的方法:
#include
#include
using
namespace std;
intmain()
變數 s1 只是定義但沒有初始化,編譯器會將預設值賦給 s1,預設值是"",也即空字串。
變數 s2 在定義的同時被初始化為"c plus plus"。與c風格的字串不同,string 的結尾沒有結束標誌』\0』。
變數 s3 在定義的時候直接用 s2 進行初始化,因此 s3 的內容也是"c plus plus"。
變數 s4 被初始化為由 5 個』s』字元組成的字串,也就是"sssss"。
從上面的**可以看出,string 變數可以直接通過賦值操作符=進行賦值。string 變數也可以用c風格的字串進行賦值,例如,s2 是用乙個字串常量進行初始化的,而 s3 則是通過 s2 變數進行初始化的。
與c風格的字串不同,當我們需要知道字串長度時,可以呼叫 string 類提供的 length() 函式。如下所示:
string s =
"abcdefg"
;int len = s.
length()
;cout
#include
#include
using
namespace std;
intmain()
執行結果:
abc abc
abc
雖然我們輸入了兩個由空格隔開的**,但是只輸出了乙個,這是因為輸入運算子》缺省會忽略空格,遇到空格就認為輸入結束,所以最後輸入的 abc沒有被儲存到變數 s。
string 字串也可以像c風格的字串一樣按照下標來訪問其中的每乙個字元。string 字串的起始下標仍是從 0 開始。請看下面的**:
#include
#include
using
namespace std;
intmain()
cout
='5'
; cout
}執行結果:12
3456
7890
1234557890
本例定義了乙個 string 變數 s,並賦值 「1234567890」,之後用 for 迴圈遍歷輸出每乙個字元。借助下標,除了能夠訪問每個字元,也可以修改每個字元,s[5] = 『5』;就將第6個字元修改為 『5』,所以 s 最後為 「1234557890」。
有了 string 類,我們可以使用+或+=運算子來直接拼接字串,非常方便,再也不需要使用c語言中的 strcat()、strcpy()、malloc() 等函式來拼接字串了,再也不用擔心空間不夠會溢位了。
用+來拼接字串時,運算子的兩邊可以都是 string 字串,也可以是乙個 string 字串和乙個c風格的字串,還可以是乙個 string 字串和乙個字元陣列,或者是乙個 string 字串和乙個單獨的字元。請看下面的例子:
#include
#include
using
namespace std;
intmain()
執行結果:
first second
first third
first fourth
first @
c++ 提供的 string 類包含了若干實用的成員函式,大大方便了字串的增加、刪除、更改、查詢等操作。
一.插入字串
insert() 函式可以在 string 字串中指定的位置插入另乙個字串,它的一種原型為:
string& insert (size_t pos, const string& str);
pos 表示要插入的位置,也就是下標;str 表示要插入的字串,它可以是 string 字串,也可以是c風格的字串。
請看下面的**:
#include
#include
using
namespace std;
intmain()
執行結果:
12345aaa67890
12345bbb67890
insert() 函式的第乙個引數有越界的可能,如果越界,則會產生執行時異常。
erase() 函式可以刪除 string 中的乙個子字串。它的一種原型為:
string& erase (size_t pos = 0, size_t len = npos);
pos 表示要刪除的子字串的起始下標,len 表示要刪除子字串的長度。如果不指明 len 的話,那麼直接刪除從 pos 到字串結束處的所有字元(此時 len = str.length - pos)。
請看下面的**:
#include
#include
using
namespace std;
intmain()
執行結果:
1234567890
12345
1234590
有讀者擔心,在 pos 引數沒有越界的情況下, len 引數也可能會導致要刪除的子字串越界。但實際上這種情況不會發生,erase() 函式會從以下兩個值中取出最小的乙個作為待刪除子字串的長度:
len 的值;
字串長度減去 pos 的值。
說得簡單一些,待刪除字串最多只能刪除到字串結尾。
substr() 函式用於從 string 字串中提取子字串,它的原型為:
string substr (size_t pos = 0, size_t len = npos) const;
pos 為要提取的子字串的起始下標,len 為要提取的子字串的長度。
請看下面的**:
#include
#include
using
namespace std;
intmain()
執行結果:
first second third
second
系統對 substr() 引數的處理和 erase() 類似:
如果 pos 越界,會丟擲異常;
如果 len 越界,會提取從 pos 到字串結尾處的所有字元。
string 類提供了幾個與字串查詢有關的函式,如下所示。
1)find() 函式
find() 函式用於在 string 字串中查詢子字串出現的位置,它其中的兩種原型為:
size_t find (const string& str, size_t pos = 0) const;
size_t find (const char* s, size_t pos = 0) const;
第乙個引數為待查詢的子字串,它可以是 string 字串,也可以是c風格的字串。第二個引數為開始查詢的位置(下標);如果不指明,則從第0個字元開始查詢。
請看下面的**:
#include
#include
using
namespace std;
intmain()
執行結果:
found at index :
6
find() 函式最終返回的是子字串第一次出現在字串中的起始下標。本例最終是在下標6處找到了 s2 字串。如果沒有查詢到子字串,那麼會返回乙個無窮大值 4294967295。
2)rfind() 函式
rfind() 和 find() 很類似,同樣是在字串中查詢子字串,不同的是 find() 函式從第二個引數開始往後查詢,而 rfind() 函式則最多查詢到第二個引數處,如果到了第二個引數所指定的下標還沒有找到子字串,則返回乙個無窮大值4294967295。
請看下面的例子:
#include
#include
using
namespace std;
intmain()
執行結果:
found at index :
6
3)find_first_of() 函式
find_first_of() 函式用於查詢子字串和字串共同具有的字元在字串中首次出現的位置。請看下面的**:
#include
#include
using
namespace std;
intmain()
執行結果:
found at index :
3
本例中 s1 和 s2 共同具有的字元是 』s』,該字元在 s1 中首次出現的下標是3,故查詢結果返回3。 C Console類的具體用法
輸出到控制台 輸出到控制台就是把資料輸出到控制台並顯示出來。net框架提供了console類實現這個任務,輸出方式如下 console.writeline 輸出的值 console.write 輸出的值 console.wrietline 和console.write 的唯一卻別就是前者輸出後換行,...
C Console類的具體用法
參考 url console.write 表示向控制台直接寫入字串,不進行換行,可繼續接著前面的字元寫入。console.writeline 表示向控制台寫入字串後換行。console.read 表示從控制台讀取字串,不換行。console.readline 表示從控制台讀取字串後進行換行。cons...
c string類字串查詢
1 find 函式 find 函式用於在 string 字串中查詢子字串出現的位置,它其中的兩種原型為 size t find const string str,size t pos 0 const size t find const char s,size t pos 0 const 第乙個引數為...