1. 程式人生 > >淺談char字元型別和string字串型別

淺談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;

字元陣列轉成字串就很是容易了,直接賦值即可。

好了,今天的分享到此為止,希望大家能對這兩種字元儲存型別有所瞭解。