string(C++,java,VB等程式語言中的字元串)

本詞條是多義詞,共3個義項
更多義項 ▼ 收起列表 ▲

C++javaVB等程式語言中的字元串。 在javaC#中,String類是不可變的,對String類的任何改變,都是返回一個新的String類對象。 String 對象是 System.Char 對象的有序集合,用於表示字元串。String 對象的值是該有序集合的內容,並且該值是不可變的

基本介紹

  • 中文名:字元串
  • 外文名:String
  • 所屬領域:計算機
  • 屬性:程式語言
基本信息,特別注意,字元類型,類,作用:,命名空間,程式集,語法,C++ 中,C++ 中的 string 類,包含,用法,完整特性,MFC CString,語系沿革備註,索引,序號運算,區分運算,安全注意事項,功能,獲取字元,實現的接口,繼承層次結構,執行緒安全,版本信息,

基本信息

String就是C++javaVB等程式語言中的字元串,用雙引號引起來的幾個字元.如"Abc","一天".

特別注意

String類是不可變(final)的,對String類的任何改變,都是返回一個新的String類對象.這樣的話把String類的引用傳遞給一個方法,該方法對String的任何改變,對原引用指向的對象沒有任何影響,這一點和基本數據類型相似。
string s1,s2;s1="abc";s2=s1;s2="def";
//這樣操作之後s1是"abc",s2是"def".
string a="hello,world!";string b="hello,world!";string c="hello!";string a="hello,world!";string b="hello,world!";string c="hello!";
a 和 b 是不是指向同一個地址?其實很簡單,跟下這些字元串的記憶體地址就好了。
string a="hello,world!";
00000042moveax,dwordptrds:[02A62208h]00000048movdwordptr[ebp-44h],eax
string b="hello,world!";
0000004bmoveax,dwordptrds:[02A62208h]00000051movdwordptr[ebp-48h],eax
string c="hello!";
00000054moveax,dwordptrds:[02A756F8h]0000005amovdwordptr[ebp-4Ch],eax
a的地址指向02A62208h,b的地址也是02A62208h,這說明創建b的時候,.net機制肯定是先去查找記憶體中是否有這個字元串的記憶體地址,如果有則指向,沒有才創建。

字元類型

概述
字元串數據類型,可包含單一字元或字元串的變數型態。需要注意的是在NoahWeb中要指定字元串給字元串變數,要在頭尾加上單引號 (例如: '中國')。
可以使用“ADD”運算符將多個字元進行連線運算。
表現層示例
<!--NoahValueValueName="'NoahWeb'"-->
示例輸出
NoahWeb
示例說明
輸出一個字元。
邏輯層示例
<SetVarName="actiondesc"Value="'編輯內容'"/>
示例說明
設定一個變數名為actiondesc的局部變數的內容為字元"編輯內容"
表現層示例
<!--NoahValueValueName="'NoahWeb'ADD'1.1'"-->
示例輸出
NoahWeb1.1
示例說明
將兩個字元串相加後輸出。
邏輯層示例
<SetVarName="actiondesc"Value="'編輯內容'ADD'動作'"/>
示例說明
設定一個變數名為actiondesc的局部變數的內容為字元"編輯內容動作"

作用:

表示文本,即一系列 Unicode 字元。

命名空間

System

程式集

mscorlib(在 mscorlib.dll 中)

語法

Visual Basic(聲明)
<SerializableAttribute>_<ComVisibleAttribute(True)>_PublicNotInheritableClassStringImplementsIComparable,ICloneable,IConvertible,IComparable(OfString),_IEnumerable(OfString),IEnumerable,IEquatable(OfString)
Visual Basic (用法)
DiminstanceAsString
[SerializableAttribute][ComVisibleAttribute(true)]publicsealedclassString:IComparable,ICloneable,IConvertible,IComparable<string>,IEnumerable<string>,IEnumerable,IEquatable<string>
[SerializableAttribute][ComVisibleAttribute(true)]publicrefclassStringsealed:IComparable,ICloneable,IConvertible,IComparable<String^>,IEnumerable<String^>,IEnumerable,IEquatable<String^>
/**@attributeSerializableAttribute()*//**@attributeComVisibleAttribute(true)*/publicfinalclassStringimplementsIComparable,ICloneable,IConvertible,IComparable<String>,IEnumerable<String>,IEnumerable,IEquatable<String>
SerializableAttributeComVisibleAttribute(true)publicfinalclassStringimplementsIComparable,ICloneable,IConvertible,IComparable<String>,IEnumerable<String>,IEnumerable,IEquatable<String>
不適用。

C++ 中

C++ 中的 string 類

MFC中的CString類使用起來非常的方便好用,但是如果離開了MFC框架,還有沒有這樣使用起來非常方便的類呢?答案是肯定的。也許有人會說,即使不用MFC框架,也可以想辦法使用MFC中的API,具體的操作方法在本文最後給出操作方法。
其實,可能很多人很可能會忽略掉標準C++中string類的使用。標準C++中提供的string類得功能也是非常強大的,一般都能滿足我們開發項目時使用。現將具體用法的一部分羅列如下:

包含

要想使用標準C++中string類,必須要包含如下內容:
#include <string>// <cstring>與<string.h>也可以using namespace std;//  using std::string;  using std::wstring;也可以
下面你就可以使用string/wstring了,它們兩分別對應著char和wchar_t。

用法

string和wstring的用法是一樣的,以下只用string作介紹。
  • string類的構造函式:
string(const char *s); //用c字元串s初始化 string(int n,char c); //用n個字元c初始化
此外,string類還支持默認構造函式和複製構造函式,如string s1;string s2="hello";都是正確的寫法。當構造的string太長而無法表達時會拋出length_error異常 。
  • string類的字元操作:
const char &operator[](int n)const; const char &at(int n)const; char &operator[](int n); char &at(int n);
operator[]和at()均返回當前字元串中第n個字元的位置,但at函式提供範圍檢查,當越界時會拋出out_of_range異常,下標運算符[]不提供檢查訪問。
const char *data()const;//返回一個非null終止的c字元數組 const char *c_str()const;//返回一個以null終止的c字元串
int copy(char *s, int n, int pos = 0) const;//把當前串中以pos開始的n個字元拷貝到以s為起始位置的字元數組中,返回實際拷貝的數目

完整特性

詳細講解請看cplusplus:
  • string的特性描述:
int capacity()const; //返回當前容量(即string中不必增加記憶體即可存放的元素個數)int max_size()const; //返回string對象中可存放的最大字元串的長度int size()const; //返回當前字元串的大小int length()const; //返回當前字元串的長度bool empty()const; //當前字元串是否為空void resize(int len,char c);//把字元串當前大小置為len,並用字元c填充不足的部分
  • string類的輸入輸出操作:
string類重載運算符operator>>用於輸入,同樣重載運算符operator<<用於輸出操作。 函式getline(istream &in,string &s);用於從輸入流in中讀取字元串到s中,以換行符'\n'分開。
  • string的賦值:
string &operator=(const string &s);//把字元串s賦給當前字元串string &assign(const char *s);//用c類型字元串s賦值string &assign(const char *s,int n);//用c字元串s開始的n個字元賦值string &assign(const string &s);//把字元串s賦給當前字元串string &assign(int n,char c);//用n個字元c賦值給當前字元串string &assign(const string &s,int start,int n);//把字元串s中從start開始的n個字元賦給當前字元string &assign(const_iterator first,const_itertor last); //把first和last疊代器之間的部分賦給字元串
  • string的連線:
string &operator+=(const string &s);//把字元串s連線到當前字元串的結尾string &append(const char *s); //把c類型字元串s連線到當前字元串結尾string &append(const char *s,int n);//把c類型字元串s的前n個字元連線到當前字元串結尾string &append(const string &s); //同operator+=()string &append(const string &s,int pos,int n);//把字元串s中從pos開始的n個字元連線到當前字元串的結尾string &append(int n,char c); //在當前字元串結尾添加n個字元cstring &append(const_iterator first,const_iterator last);//把疊代器first和last之間的部分連線到當前字元串的結尾
  • string的比較:
bool operator==(const string &s1,const string &s2)const;//比較兩個字元串是否相等 運算符">","<",">=","<=","!="均被重載用於字元串的比較;int compare(const string &s) const;//比較當前字元串和s的大小int compare(int pos, int n,const string &s)const;//比較當前字元串從pos開始的n個字元組成的字元串與s的大小int compare(int pos, int n,const string &s,int pos2,int n2)const;//比較當前字元串從pos開始的n個字元組成的字元串與s中//pos2開始的n2個字元組成的字元串的大小int compare(const char *s) const;int compare(int pos, int n,const char *s) const;int compare(int pos, int n,const char *s, int pos2) const;//compare函式在大於(>)時返回1,小於(<)時返回-1,等於(==)時返回0
  • string的子串:
string substr(int pos = 0,int n = npos) const;//返回pos開始的n個字元組成的字元串
  • string的交換:
void swap(string &s2); //交換當前字元串與s2的值
  • string類的查找函式:
int find(char c, int pos = 0) const;//從pos開始查找字元c在當前字元串的位置int find(const char *s,int pos = 0) const;//從pos開始查找字元串s在當前串中的位置int find(const char *s, int pos, int n) const;//從pos開始查找字元串s中前n個字元在當前串中的位置int find(const string &s,int pos = 0) const;//從pos開始查找字元串s在當前串中的位置 //查找成功時返回所在位置,失敗返回string::npos的值int rfind(char c, int pos = npos) const;//從pos開始從後向前查找字元c在當前串中的位置int rfind(const char *s, int pos = npos) const;int rfind(const char *s, int pos, int n = npos) const;int rfind(const string &s,int pos = npos) const; //從pos開始從後向前查找字元串s中前n個字元組成的字元串在當前串中的位置,成功返回所在位置,失敗時返回string::npos的值int find_first_of(char c, int pos = 0) const;//從pos開始查找字元c第一次出現的位置int find_first_of(const char *s, int pos = 0) const;int find_first_of(const char *s, int pos, int n) const;int find_first_of(const string &s,int pos = 0) const; //從pos開始查找當前串中第一個在s的前n個字元組成的數組裡的字元的位置。查找失敗返回string::nposint find_first_not_of(char c, int pos = 0) const;int find_first_not_of(const char *s, int pos = 0) const;int find_first_not_of(const char *s, int pos,int n) const;int find_first_not_of(const string &s,int pos = 0) const; //從當前串中查找第一個不在串s中的字元出現的位置,失敗返回string::nposint find_last_of(char c, int pos = npos) const;int find_last_of(const char *s, int pos = npos) const;int find_last_of(const char *s, int pos, int n = npos) const;int find_last_of(const string &s,int pos = npos) const;int find_last_not_of(char c, int pos = npos) const;int find_last_not_of(const char *s, int pos = npos) const;int find_last_not_of(const char *s, int pos, int n) const;int find_last_not_of(const string &s,int pos = npos) const; //find_last_of和find_last_not_of與find_first_of和find_first_not_of相似,只不過是從後向前查找。
  • string類的替換函式:
string &replace(int p0, int n0,const char *s);//刪除從p0開始的n0個字元,然後在p0處插入串sstring &replace(int p0, int n0,const char *s, int n);//刪除p0開始的n0個字元,然後在p0處插入字元串s的前n個字元string &replace(int p0, int n0,const string &s);//刪除從p0開始的n0個字元,然後在p0處插入串sstring &replace(int p0, int n0,const string &s, int pos, int n);//刪除p0開始的n0個字元,然後在p0處插入串s中從pos開始的n個字元string &replace(int p0, int n0,int n, char c);//刪除p0開始的n0個字元,然後在p0處插入n個字元cstring &replace(iterator first0, iterator last0,const char *s);//把[first0,last0)之間的部分替換為字元串sstring &replace(iterator first0, iterator last0,const char *s, int n);//把[first0,last0)之間的部分替換為s的前n個字元。string &replace(iterator first0, iterator last0,const string &s);//把[first0,last0)之間的部分替換為串sstring &replace(iterator first0, iterator last0,int n, char c);//把[first0,last0)之間的部分替換為n個字元cstring &replace(iterator first0, iterator last0,const_iterator first, const_iterator last);//把[first0,last0)之間的部分替換成[first,last)之間的字元串。
  • string類的插入函式:
string &insert(int p0, const char *s);string &insert(int p0, const char *s, int n);string &insert(int p0,const string &s);string &insert(int p0,const string &s, int pos, int n); //前4個函式在p0位置插入字元串s中pos開始的前n個字元string &insert(int p0, int n, char c);//此函式在p0處插入n個字元citerator insert(iterator it, char c);//在it處插入字元c,返回插入後疊代器的位置void insert(iterator it, const_iterator first, const_iterator last);//在it處插入[first,last)之間的字元void insert(iterator it, int n, char c);//在it處插入n個字元c
  • string類的刪除函式
iterator erase(iterator first, iterator last);//刪除[first,last)之間的所有字元,返回刪除後疊代器的位置。iterator erase(iterator it);//刪除it指向的字元,返回刪除後疊代器的位置。string &erase(int pos = 0, int n = npos);//刪除pos開始的n個字元,返回修改後的字元串。
  • string類的疊代器處理:
string類提供了向前和向後遍歷的疊代器iterator,疊代器提供了訪問各個字元的語法,類似於指針操作,疊代器不檢查範圍。
用string::iterator或string::const_iterator聲明疊代器變數,const_iterator不允許改變疊代的內容。常用疊代器函式有:
const_iterator begin()const; iterator begin(); //返回string的起始位置const_iterator end()const; iterator end(); //返回string的最後一個字元後面的位置const_iterator rbegin()const; iterator rbegin(); //返回string的最後一個字元的位置const_iterator rend()const; iterator rend(); //返回string第一個字元位置的前面
rbegin和rend用於從後向前的疊代訪問,通過設定疊代器string::reverse_iterator或string::const_reverse_iterator實現
  • 字元串流處理:
    通過定義ostringstream和istringstream變數實現,在#include <sstream>頭檔案中。
    例如:
string input("hello,this is a test"); istringstream is(input); string s1,s2,s3,s4;is>>s1>>s2>>s3>>s4;//s1="hello,this",s2="is",s3="a",s4="test" ostringstream os; os<<s1<<s2<<s3<<s4; cout<<os.str();
以上就是對C++ string類的一個簡要介紹。用的好的話它所具有的功能不會比MFC中的CString類遜色多少。

MFC CString

最後要介紹如何在Win32 應用程式中引用MFC中的部分類,例如CString。
1.在工程目錄下右鍵選擇
"Properties”--->"Configuration Properties”--->“General”--->"Use of MFC"--->"Use MFC in a Static Library",
默認的是:"Use Standard Windows Libraries",如下圖:
&#39;Use Standard Windows Libraries&#39;&#39;Use Standard Windows Libraries&#39;
2.在你所用的所有頭檔案之前包含#include <afxwin.h>。
例如:可以在stdafx.h檔案的最前面包含#include <afxwin.h>頭檔案,這樣在你的原始碼中就可以使用CString類了,不過這樣也有一個缺點,就是編譯出來的程式要比原來的大很多。

語系沿革備註

String 對象稱為不可變的(唯讀),因為一旦創建了該對象,就不能修改該對象的值。看來似乎修改了 String 對象的方法實際上是返回一個包含修改內容的新 String 對象。如果需要修改字元串對象的實際內容,請使用 System.Text.StringBuilder 類。
字元串中的每個 Unicode 字元都是由 Unicode 標量值定義的,Unicode 標量值也稱為 Unicode 碼位或者 Unicode 字元的序號(數字)值。每個碼位都是使用 UTF-16 編碼進行編碼的,編碼的每個元素的數值都用一個 Char 對象表示。
一個 Char 對象通常表示一個碼位,即:Char 的數值等於該碼位。但是,一個碼位可能需要多個編碼元素。例如,Unicode 輔助碼位(代理項對)使用兩個 Char 對象來編碼。

索引

索引是 Char 對象在 String 中的位置,而不是 Unicode 字元的位置。索引是從零開始、從字元串的起始位置(其索引為零)計起的非負數字。連續的索引值可能並不與連續的 Unicode 字元相對應,這是因為一個 Unicode 字元可能會編碼為多個 Char 對象。若要使用每個 Unicode 字元而不是每個 Char 對象,請使用 System.Globalization.StringInfo 類。

序號運算

String 類的成員對 String 對象執行序號運算或語義運算。序號運算是對每個 Char 對象的數值執行的。語義運算則對考慮了特定於區域性的大小寫、排序、格式化和語法分析規則的 String 的值執行。語義運算在顯式聲明的區域性或者隱式當前區域性的上下文中執行。有關當前區域性的更多信息,請參見 CultureInfo.CurrentCulture 主題。
大小寫規則決定如何更改 Unicode 字元的大小寫,例如,從小寫變為大寫。
格式化規則決定如何將值轉換為它的字元串表示形式,而語法分析規則則確定如何將字元串表示形式轉換為值。
排序規則確定 Unicode 字元的字母順序,以及兩個字元串如何互相比較。例如,Compare 方法執行語義比較,而 CompareOrdinal 方法執行序號比較。因此,如果當前的區域性為美國英語,則 Compare 方法認為“a”小於“A”,而 CompareOrdinal 方法會認為“a”大於“A”。
.NET Framework 支持單詞、字元串和序號排序規則。單詞排序會執行區分區域性的字元串比較,在這種比較中,某些非字母數字 Unicode 字元可能會具有特殊的權重。例如,連字元(“-”)的權重非常小,因此“coop”和“co-op”在排序列表中是緊挨著出現的。字元串排序與單詞排序相似,只是所有非字母數字元號均排在所有字母數字 Unicode 字元前面,沒有特例。

區分運算

區分區域性的比較是顯式或隱式使用 CultureInfo 對象的任何比較,包括由 CultureInfo.InvariantCulture 屬性指定的固定區域性。當前隱式區域性由 Thread.CurrentCulture 屬性指定。
序號排序基於字元串中每個 Char 對象的數值對字元串進行比較。序號比較自動區分大小寫,因為字元的小寫和大寫版本有著不同的碼位。但是,如果大小寫在應用程式中並不重要,則可以指定忽略大小寫的序號比較。這相當於使用固定區域性將字元串轉換為大寫,然後對結果執行序號比較。
有關單詞、字元串和序號排序規則的更多信息,請參見 System.Globalization.CompareOptions 主題。
區分區域性的比較通常適用於排序,而序號比較則不適合。序號比較通常適用於確定兩個字元串是否相等(即,確定標識),而區分區域性的比較則不適用。
比較和搜尋方法的“備註”指定方法是區分大小寫、區分區域性還是兩者區分。根據定義,任何字元串(包括空字元串 (""))的比較結果都大於空引用;兩個空引用的比較結果為相等。
規範化
某些 Unicode 字元具有多個等效的二進制表示形式,這些表示形式中包含幾組組合的和/或複合的 Unicode 字元。Unicode 標準定義了一個稱為規範化的過程,此過程將一個字元的任何一種等價二進制表示形式轉換為統一的二進制表示形式。可使用多種遵循不同規則的算法執行規範化,這些算法也稱為範式。.NET Framework 當前支持範式 C、D、KC 和 KD。通常用序號比較來評估一對規範化的字元串。

安全注意事項

如果應用程式進行有關符號標識符(如檔案名稱或命名管道)或持久數據(如 XML 檔案中基於文本的數據)的安全決策,則該操作應該使用序號比較而不是區分區域性的比較。這是因為根據起作用的區域性的不同,區分區域性的比較可產生不同的結果,而序號比較則僅依賴於所比較字元的二進制值。

功能

String 類提供的成員執行以下操作:比較 String 對象;返回 String 對象內字元或字元串的索引;複製 String 對象的值;分隔字元串或組合字元串;修改字元串的值;將數字、日期和時間或枚舉值的格式設定為字元串;對字元串進行規範化。
使用 Compare、CompareOrdinal、CompareTo、Equals、EndsWith 和 StartsWith 方法進行比較。
使用 IndexOf、IndexOfAny、LastIndexOf 和 LastIndexOfAny 方法可獲取字元串中子字元串或 Unicode 字元的索引。
使用 Copy 和 CopyTo 可將字元串或子字元串複製到另一個字元串或 Char 類型的數組
使用 Substring 和 Split 方法可通過原始字元串的組成部分創建一個或多個新字元串;使用 Concat 和 Join 方法可通過一個或多個子字元串創建新字元串。
使用 Insert、Replace、Remove、PadLeft、PadRight、Trim、TrimEnd 和 TrimStart 可修改字元串的全部或部分。
使用 ToLower、ToLowerInvariant、ToUpper 和 ToUpperInvariant 方法可更改字元串中 Unicode 字元的大小寫。
使用 Length 屬性可獲取字元串中 Char 對象的數量;使用 Chars 屬性可訪問字元串中實際的 Char 對象。
使用 IsNormalized 方法可測試某個字元串是否已規範化為特定的範式。使用 Normalize 方法可創建規範化為特定範式的字元串。

獲取字元

string 類型通過下標操作符([ ])來訪問 string 對象中的單個字元。下標操作符需要取一個 size_type 類型的值,來標明要訪問字元的位置。這個下標中的值通常被稱為“下標”或“索引”(index).
可用下標操作符分別取出 string 對象的每個字元,分行輸出:
string str("some string");for (string::size_type ix = 0; ix != str.size(); ++ix)cout << str[ix] << endl;
每次通過循環,就從 str 對象中讀取下一個字元,輸出該字元並換行。

實現的接口

String 類分別用於實現 IComparable、ICloneable、IConvertible、IEnumerable 和 IComparable 接口。使用 Convert 類進行轉換,而不是使用此類型的 IConvertible 顯式接口成員實現。

繼承層次結構

System.Object
System.String

執行緒安全

此類型是執行緒安全的。
平台Windows 98, Windows Server 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
Windows Vista、Microsoft Windows XP SP2 和 Windows Server 2003 SP1 支持 Microsoft .NET Framework 3.0。

版本信息

.NET Framework
受以下版本支持:3.0、2.0、1.1、1.0
.NET Compact Framework
受以下版本支持:2.0、1.0
XNA Framework
受以下版本支持:1.0

相關詞條

熱門詞條

聯絡我們