C/C++之string和char的使用及區(qū)別
一、概念
- Char:在C中,char是定義一個(gè)字符,存儲的是一個(gè)字符,占一個(gè)字節(jié),如’a’,C++中char是字符類型,是一種基本數(shù)據(jù)類型;
- String:string是一個(gè)模板類,實(shí)例化的是對象,它的內(nèi)部是封裝了const char*類型,是一個(gè)常量指針,指向可以改變,但是指向的值不能改變。
- 字符串:字符串是使用’\0’終止的一維字符數(shù)組(字符串的長度為字符個(gè)數(shù)加1,’\0’也占一個(gè)長度)。在C++中,字符串有兩種,一種是字符串char[],即C風(fēng)格的字符串,一種是封裝好的字符串類String。
二、操作函數(shù)
- strcpy(s1,s2) 復(fù)制字符串s2到s1,s2復(fù)制到了最前面
- strcat(s1,s2) 連接字符串s2到字符串s1的末尾
- strlen(s1) 返回字符串s1的長度
- strcmp(s1,s2) 比較字符串的大小,若s1=s2,返回0,若s1> s2 ,返回正數(shù),若s1< s2,返回負(fù)數(shù)
- strchr(s1,ch) 返回一個(gè)指針,指向s1中字符ch第一次出現(xiàn)的位置
- strstr(s1,s2) 返回一個(gè)指針,指向s1中字符串s2第一次出現(xiàn)的位置
三、例子
1、字符串定義例子
char greet[] = "hello";//這兩行語句等價(jià)
char greet[6] = {'h','e','l','l','o','\0'};
2、定義string及一些基本操作
string s1 = "hello"; string s2 = "world"; string s3; s3 = s1;//復(fù)制 s3 = s1 + s2;//連接兩個(gè)字符串 int len = s3.size();//獲取字符串的長度
3、string中的每一個(gè)字符,使用單引號,是char類型
string s = "hell0"; char ch = s[0]; //'h' char ch='abc'; cout<<ch; //打印c //只打印一個(gè)c,為什么只打印一個(gè)c? //abc是一個(gè)字符串,賦值給一個(gè)字符時(shí),會取字符串中最低的位數(shù)賦值。
4、字符串輸出
string a;
printf("%s",a);
//輸出亂碼,對于string這類,要用一下加.c_str()的方式,這個(gè)函數(shù)是返回字符串string的首地址,因?yàn)?s要的是char*,但是string只是字符串,要通過函數(shù)名來返回其首地址。
string a;
printf("%s",a.c_str());
四、Char和string異同
在c++中,C風(fēng)格的字符串和String類的比較,可以看下面這張圖

char是一個(gè)字符型指針,可以指向一個(gè)字符數(shù)組,與string不太相同的是,字符數(shù)組存儲的字符串必須以’\0’結(jié)尾,代表結(jié)束符號,而string并不一定以’\0’結(jié)束。
string的內(nèi)存管理是由系統(tǒng)處理的,除非內(nèi)存池用完,否則基本上不會出現(xiàn)什么內(nèi)存問題。
而char的內(nèi)存需要自己手動管理了,很容易出現(xiàn)內(nèi)存問題。
五、char*和string的互相轉(zhuǎn)化
如果要將string直接轉(zhuǎn)換為const char*類型,可以使用兩個(gè)函數(shù)。
1、c_str()
string s="abcd"; const char*ch=s.c_str();
c_str()函數(shù)返回一個(gè)指向正規(guī)C字符串的指針,內(nèi)容與string相同,因?yàn)镃本身沒有string類。但是,上面這種用法很不安全,因?yàn)閏h最后指向的內(nèi)容是垃圾值,s對象被析構(gòu)了。而且c_str()返回的是一個(gè)臨時(shí)指針,不能對其進(jìn)行操作。
2、strcpy()
通過strcpy函數(shù)來進(jìn)行轉(zhuǎn)換是安全的:
char ch[20]; string s="abcd"; strcpy(ch,s.c_str());
3、data()
string s="abcd"; const char*ch=s.data();
- 那c_str()和data()有什么區(qū)別呢?
- c_str()會在數(shù)據(jù)的末尾添加’\0’結(jié)束符,多數(shù)用于使用字符串場合。
- 而data()函數(shù)不會添加’\0’結(jié)束符。
4、如果要轉(zhuǎn)換為char而非const char類型
string s="abcd"; char *ch; ch=(char*)malloc((s.length())*sizeof(char)); s.copy(ch,s.length(),0);//把當(dāng)前串中以0開始的s.length()個(gè)字符拷貝到以ch為起始位置的字符數(shù)組中,返回實(shí)際拷貝的數(shù)目 cout<<ch;
5、通過str[i]的方式取值的類型
string s = "abcd"; cout << typeid(s[1]).name() << endl; //char 我測試輸出 c.
六、總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳細(xì)分析c++ const 指針與指向const的指針
這篇文章主要介紹了c++ const 指針與指向const的指針的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
OpenCV實(shí)現(xiàn)馬賽克和毛玻璃濾鏡效果
這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)馬賽克和毛玻璃濾鏡效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
qtcreater配置opencv遇到的坑及實(shí)踐記錄
我配置opencv不管是按照網(wǎng)上的教程還是deep seek發(fā)現(xiàn)都有些問題,下面是我的配置方法以及實(shí)踐成功的心得,感興趣的朋友跟隨小編一起看看吧2025-05-05
從匯編看c++中函數(shù)里面的static關(guān)鍵字的使用說明
c++中的static關(guān)鍵字使得函數(shù)里面的局部變量的存活期不在局限于函數(shù)里面,而是變?yōu)樵谡麄€(gè)程序生命期里面都有效2013-05-05

