淺談char字元型別和string字串型別
char和string 兩者關係很微妙,因為都是字元,但是他們直接的聯絡卻不是很多,這裡我和大家聊聊字元的兩大勢力的相愛相殺。
char也就是字元型資料定義,string也就是字串型別資料定義,乍一看他們很想,一個是字元一個是字串,字串不就是字串起來得到的嗎?但是事實上,字串即是“字元”串起來也不是“字元”串起來,聽起來是不是很奇怪,這裡面的兩個字元的意義其實是不一樣的,第一個“字元”的意思是指一個單位的字形、類字形單位或符號的基本資訊,而第二個“字元”的意思是字元型別。可能大家聽得還是很糊塗,我幫大家捋一捋,我們現在要先弄清楚一點,char是字元型別,屬於一個類,屬於程式語言中的一個數據型別,而他和字元有區別,字元是什麼?字元指的是一個基本資訊單位,也就是說字元是一個數據,它可以是數字也可以是字母。
所以,char是一個可以用來儲存字元資料的變數型別,而string就是一個儲存一串字元資料的變數型別,他們的共同點就是他們都是變數型別,都是用來儲存字元的。
我想這樣說大家應該明白了,既然他們倆如此相像,也就免不了他們要常常互動了,不過在講他們的互動之前,我要和大家再提一個概念,不過希望大家能先理清剛剛講的再看,不然會越看越亂的。
下面我要說的就是字元陣列,char[],他是一組char類變數組成的,也可以用來儲存一串字元資料,和string的作用很是相像,但是本質是不一樣的,他們應該是陣列變數,一個是類變數,char[]很好理解,他就是一個數組,每個單元裡面放一個字元資料,string則是一個整體,最後以字元’\0’,作為分隔標識,而且他還有很多類函式可以呼叫使用。
下面舉個例子:
#include<iostream> #include<string> using namespace std; void main() { string Lyu; Lyu = "I love C++"; cout << "字串為:" + Lyu << endl; cout << "字串的長度為:" << Lyu.length() << endl; cout << "是否為空:" << Lyu.empty() << endl << endl; //若返回值為0,則指字串不為空 Lyu.append("!"); //字串後追加一個! cout << "追加修改後的字串為:" << Lyu << endl << endl; string Lyu_2; Lyu_2 = "I love too"; Lyu.swap(Lyu_2); //字串資料交換 cout << "交換修改後的字串為:" << Lyu << endl << endl; int site; site = Lyu.find('l', 0); //從0開始尋找出現l的位置並返回位置 cout << "字串中出現l的位置為:" << site << endl; site = Lyu.find("oo", 0); //從0開始尋找出現oo的位置並返回位置 cout << "字串中出現oo的位置為:" << site << endl << endl; site = 0; //遍歷搜尋所有o的位置 do { site = Lyu.find('o', site); if (site == -1) cout << "搜尋完畢,無其他項" << endl; else cout << "字串中出現o的位置為:" << site << endl; site++; } while (site != 0); getchar(); }
它的執行結果是:
和大家提了幾個常用函式,如
length()函式——檢視字串的長度
empty()函式——檢查字串是否為空,0表示不為空
append("字串")——在字串後新增新字元
find('字元', 0)——從0位檢視第一個出現的該字元的位置
……
具體理論區別大家有興趣可以去自行研究,我就不做太深入的介紹了,下面就到正題,這兩者的相互轉化。
string類怎麼轉換成一個char陣列
下面是程式碼
#include<iostream>
#include<string>
using namespace std;
void main()
{
string LyuS = "Welcome to learn C++";
const char *LyuC = LyuS.data(); //字串轉換為字元陣列
cout << "LyuC :"<< LyuC << endl;
for(int i = 0 ; i < LyuS.length() ; i ++)
cout << "LyuC[" << i << "] :" << LyuC[i] << endl;
char LyuC_2[10];
LyuC_2[0] = 'a'; //給字元陣列進行賦值
for (int j = 1; j < 9; j++)
{
LyuC_2[j] = LyuC_2[j - 1] +1;
}
LyuC_2[9] = '\0';
string LyuS_2 = LyuC_2; //字元陣列轉化成字串
cout << "LyuS_2 :" << LyuS_2;
getchar();
}
它的執行結果是:
const char *LyuC = LyuS.data();
這句話就是字串轉字元陣列,我在不少資料裡面發現他們把字元陣列和字元指標分開了,其實在C++裡面陣列在某種意義上就是連續不斷的指標,當然只限於在用法上,所以對於初學者如果不是要求完成度特別高,可以這麼用,
string LyuS_2 = LyuC_2;
字元陣列轉成字串就很是容易了,直接賦值即可。
好了,今天的分享到此為止,希望大家能對這兩種字元儲存型別有所瞭解。