char string 区别
由于在C++項目中,經(jīng)常遇到處理字符方面的問題,故借此機(jī)會整理一下,讓自己對于char , string 等有進(jìn)一步的了解。
- 基本概念
由單引號括起來的一個字符成為char型字面值。雙引號括起來的零個或多個字符則構(gòu)成字符串型字面值。
'a' // 字符字面值 "Hello World!"//字符串字面值字符串字面值得類型=>由常量字符構(gòu)成的數(shù)組,并在結(jié)尾處添加一個空字符('\0');因此字符串字面值的實際長度比它的內(nèi)容多1。
'A'//單獨的字符A"A"//包含兩個字符,一個字母A,一個空字符。
- C標(biāo)準(zhǔn)庫String函數(shù)
| strlen(p) | 返回p的長度,空字符不計算在內(nèi),傳入此類函數(shù)的指針必須紙箱以空字符作為結(jié)束的數(shù)組。 |
| strcmp(p1,p2) | 比較p1和p2的相等性。如果p1 == p2,返回0;如果p1>p2,返回一個正值;如果p1<p2,返回一個負(fù)值。 傳入此類函數(shù)的指針必須紙箱以空字符作為結(jié)束的數(shù)組。 |
| strcat(p1,p2) | 將p2附加到p1之后,返回p1;傳入此類函數(shù)的指針必須紙箱以空字符作為結(jié)束的數(shù)組。 |
| strcpy(p1,p2) | 將p2拷貝給p1,返回p1;傳入此類函數(shù)的指針必須紙箱以空字符作為結(jié)束的數(shù)組。 |
?
?
?
?
?
?
char ca [] = {'C', '+', '+'}; //不以空字符結(jié)束 cout << strlen(ca)<<endl; //錯誤,ca沒有以空字符結(jié)束當(dāng)使用數(shù)組的時候,其實真正用的是指向數(shù)組首元素的指針。
混用string對象和C風(fēng)格字符串
上述返過來就不行,如下:
不能用string對象直接初始化指向字符的指針。為此,string提供了c_str的成員函數(shù),來實現(xiàn)此效果。
string s("Hello World"); //可以,s內(nèi)容是 Hello World char * str = s; //錯誤 const char *str = s.c_str(); //正確 ,注意是 const char *c_str函數(shù)返回結(jié)果是一個指針,指向一個以空字符結(jié)束的字符數(shù)組,而這個數(shù)組所存的數(shù)據(jù)恰好與那個string對象的一樣。結(jié)果指針的類型是const char *,從而確保我們不會改變字符數(shù)組的內(nèi)容。
注意:c_str()返回的數(shù)組無法保證一直有效,如果后續(xù)的操作改變了s的值,就可能讓之前返回的數(shù)組失效。
如果執(zhí)行完c_str()函數(shù)后程序想一直都能使用其返回的數(shù)組,最好將該數(shù)組重新拷貝一份。
- 標(biāo)準(zhǔn)庫類型 String
標(biāo)準(zhǔn)庫string表示可變長的字符序列,首先要包含string頭文件,且string定義在命名空間std中。
string s1 ;//默認(rèn)初始化,s1是一個空串 string s2(s1); // s2 是 s1 的副本 string s2 = s1; // 等價于s2(s1),s2 是s1的副本 string s3("value") ;//s3是字面值value的副本,不過沒有后面的那個空字符 string s3 = "value";//等價于s3("value"),s3 是字面值"value"的副本。 string s4(n,'c'); // 把s4初始化為由連續(xù)n個字符c組成的串。有關(guān)標(biāo)準(zhǔn)類型String對象上的操作有s.size()? s.empty() s1+s2 s1 = s2 s[n] s1==s2? < <= > >= !=
- 數(shù)組方面
字符數(shù)組的特殊性:它有一種額外的初始化形式,可以用字符串字面值對此類數(shù)組初始化。
char a1[] = {'C', '+', '+'};//列表初始化,沒有空字符 char a2[] = {'C', '+', '+','\0'}; // 列表初始化,含有顯式的空字符 char a3[] = "C++" ;//會自動添加表示字符串結(jié)束的空字符 const char a4[6] = "Daniel"; //錯誤,沒有空間可存放空字符string 類型數(shù)組:?
string a4[3] = {"hi","bye"};//等價于a4[] = {"hi","bye",""};在C語言中,可以使用以下方式:
char *str ="hello world"; //但是這種方式在IOS C++11 運(yùn)行下不行。C語言有兩種表示字符串的方法,一種是字符數(shù)組,另一種是字符串常量,它們在內(nèi)存中的存儲位置不同,使得字符數(shù)組可以讀取和修改,而字符串常量只能讀取不能修改。
#include <stdio.h> int main(){char *str = "Hello World!";str = "I love C!"; //正確str[3] = 'P'; //錯誤return 0; }在編程過程中如果只涉及到對字符串的讀取,那么字符數(shù)組和字符串常量都能夠滿足要求;如果有寫入(修改)操作,那么只能使用字符數(shù)組,不能使用字符串常量。
這兩種方式(字符數(shù)組和字符串指針)它們最根本的區(qū)別是在內(nèi)存中的存儲區(qū)域不一樣,字符數(shù)組存儲在全局?jǐn)?shù)據(jù)區(qū)或棧區(qū),第二種形式的字符串存儲在常量區(qū)。全局?jǐn)?shù)據(jù)區(qū)和棧區(qū)的字符串(也包括其他數(shù)據(jù))有讀取和寫入的權(quán)限,而常量區(qū)的字符串(也包括其他數(shù)據(jù))只有讀取權(quán)限,沒有寫入權(quán)限。
還有一點需要注意,就是當(dāng)用到sizeof時:
char *str1 = "hello wrold"; char str2[] = "hello world"; cout<<sizeof(str1); //8 機(jī)子是64位 cout << sizeof(str2); //12?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/ycbeginner/p/9362481.html
總結(jié)
以上是生活随笔為你收集整理的char string 区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Odoo 菜单美化的扩展模块
- 下一篇: logstash解析系统的message