c字符串,string對(duì)象,字符串字面值的區(qū)別詳解
一、字符串字面值
字符串字面值是一串常量字符,字符串字面值常量用雙引號(hào)括起來(lái)的零個(gè)或多個(gè)字符表示,為兼容C語(yǔ)言,C++中所有的字符串字面值都由編譯器自動(dòng)在末尾添加一個(gè)空字符。
字符串沒(méi)有變量名字,自身表示自身
"Hello World!" //simple string literal
"" //empty string literal
"\nCC\toptions\tfile.[cC]\n" //string literal using newlines and tabs
字符字面值: 'A' //single quote:character literal
字符串字面值: "A" //double quote:character string literal.包含字母A和空字符的字符串
字符串字面值的連接:
std::out << "a multi-line "+
"string literal"+
" using concatenation"
<< std::endl;
輸出:a multi-line string literal using concatenation
多行字面值:
std::out << "a multi-line \n
string literal\n
using a backslash"
<< std::endl;
輸出:a multi-line string literalusing a backslash
=================================================
1. string literal:字符串直接量:
cout<<"hello"<<endl;
代碼中通過(guò)包含"hello"字符串自身來(lái)將其輸出,并未包含該字符串的變量。
2. 字符串直接量可以賦值給變量,但是與字符串直接量相關(guān)聯(lián)的內(nèi)存空間位于只讀部分,因此它是常量字符數(shù)組。
char* ptr = "hello";
ptr[1] = 'a';//crash! attemps to write to read-only memory.
因此,當(dāng)引用字符串直接量的時(shí)候使用指向const的字符數(shù)組:
const char* ptr = "hello";
ptr[1] = 'a';//bug! attempts to write to read-only memory.
3. 當(dāng)將字符串直接量賦值給字符數(shù)組的初始值的時(shí)候。由于字符數(shù)組存放與棧中,不允許引用其他地方的內(nèi)存,因此編譯器會(huì)將字符串直接量復(fù)制到站的數(shù)組內(nèi)存中。因此,可以進(jìn)行相應(yīng)的修改。
char stackArray[] = "hello";
stackArray[1] = 'a';
二、C++風(fēng)格字符串
C++風(fēng)格字符串:使用C++風(fēng)格字符串的時(shí)候,要將它當(dāng)做是一個(gè)普通的類(lèi)型,如int,這樣反而會(huì)避免將string作為一個(gè)類(lèi)來(lái)理解所帶來(lái)的很多問(wèn)題。
1. 支持<cstring>中許多函數(shù)完成的同樣操作。
2. 字符串定義:
string myString = “hello”;
3. 操作符 = :復(fù)制字符串;比如:
string newone = original;
會(huì)將后者復(fù)制給前者,不會(huì)出現(xiàn)兩個(gè)變量同樣指向一個(gè)內(nèi)存的情況。
4. 可以像int一樣使用 == 之類(lèi)的操作符
5. 可以改變字符串中的某一個(gè)字符。 如
string myString = "hello"; mystring[0] = 'l';
這中操作是允許的。
2.1 C風(fēng)格字符串的使用
C++語(yǔ)言通過(guò)(const) char *類(lèi)型的指針來(lái)操縱C風(fēng)格字符串。
#include <cstring> // cstring是string.h頭文件中的C++版本,而string.h是C語(yǔ)言提供的標(biāo)準(zhǔn)庫(kù)
//操縱C風(fēng)格字符串的標(biāo)準(zhǔn)庫(kù)函數(shù)(參數(shù)類(lèi)型省略,都是char *類(lèi)型):
strlen(s) // 返回s的長(zhǎng)度,不包括字符串結(jié)束符null
strcmp(s1, s2) //當(dāng)s1<s2時(shí),返回值<0 ,當(dāng)s1=s2時(shí),返回值=0 ,當(dāng)s1>s2時(shí),返回值>0
strcat(s1, s2) // 將字符串s2連接到s1后,并返回s1
strcpy(s1, s2) // 將s2復(fù)制給s1,并返回s1
strncat(s1, s2, n) // 將s2的前n個(gè)字符連接到s1后面,并返回s1
strncpy(s1, s2, n) // 將s2的前n個(gè)字符復(fù)制給s1,并返回s1
if(cp1 < cp2) // compares address, not the values pointed to
const char *cp1 = "A string example";
const char *cp2 = "A different string";
int i=strcmp(cp1, cp2); // i is positive
i=strcmp(cp2, cp1); // i is negative
i=strcmp(cp1, cp1); // i is zero
2.3 永遠(yuǎn)不要忘記字符串結(jié)束符null
char ca[]={'C', '+', '+'}; // not null-terminated
cout << strlen(ca) << endl; // disaster: ca isn't null-terminated
2.4 調(diào)用者必須確保目標(biāo)字符串具有足夠的大小
// Dangerous:What happens if we miscalculate the size of largeStr?
char largeStr[16+18+2]; // will hold cp1 a space and cp2
strcpy(largeStr, cp1); // copies cp1 into largeStr
strcat(largeStr, " "); // adds a space at end of largeStr
strcat(largeStr, cp2); // concatenates cp2 to largeStr
// prints A string example A different string
cout << largeStr << endl;
2.5 使用strn函數(shù)處理C風(fēng)格字符串
char largeStr[16+18+2] // to hold cp1 a space and cp2
strncpy(largeStr, cp1, 17); // size to copy includes the null
strncat(largeStr, " ", 2); // pedantic, but a good habit
strncat(largeStr, cp2, 19); // adds at most 18 characters, plus a null
2.6 盡可能使用標(biāo)準(zhǔn)庫(kù)類(lèi)型string
string largeStr = cp1; // initialize largeStr as a copy of cp1
largeStr += " "; // add space at end of largeStr
largeStr += cp2; // concatenate cp2 onto end of largeStr
此時(shí),標(biāo)準(zhǔn)庫(kù)負(fù)責(zé)處理所有的內(nèi)在管理問(wèn)題。
三、C風(fēng)格字符串
字符串字面值的類(lèi)型實(shí)質(zhì)是const char類(lèi)型的數(shù)組。C++從C語(yǔ)言繼承下來(lái)的一種通用結(jié)構(gòu)是C風(fēng)格字符串,而字符串字面值就是該類(lèi)型的實(shí)例。C風(fēng)格字符串是以空字符null結(jié)束的字符數(shù)組:
char ca1[]={'C', '+', '+'}; // no null, not C-style string
char ca2[]={'C', '+', '+', '\0'}; // explicit null
char ca3[]="C++"; // null terminator added automatically
const char *cp="C++"; // null terminator added automatically
char *cp1=ca1; // points to first element of a array, but not C-style string
char *cp2=ca2; // points to first element of a null-terminated char array
ca1和cp1都不是C風(fēng)格字符串:ca1是一個(gè)不帶結(jié)束符null的字符數(shù)組,而指針cp1指向ca1,因此,它指向的并不是以null結(jié)束的數(shù)組。
字符串的連接:
1.c++中string可以替代c中的char數(shù)組且前者用起來(lái)更方便。連接兩個(gè)string對(duì)象只需用'+';c字符串是用char數(shù)組實(shí)現(xiàn)的。以下都稱(chēng)c字符串為char數(shù)組
例如:
string s1="hello",s2="world";
string s3=s1+s2; //也可以s3=s1+"world"
cout<<s3<<endl;//結(jié)果為helloworld
當(dāng)然還可以用+=連接。
2.還可以這樣連接一個(gè)string對(duì)象和char數(shù)組。
例如:
string s1="hello";
char s2[]="world";
cout<<s1+s2<<endl;//輸出結(jié)果為helloworld
但不能這樣連接兩個(gè)char數(shù)組或字符字面值。
例如:
string s1="hello";
string s2="world";
string s3=s1+"world";//正確,可以連接一個(gè)string對(duì)象和字符串字面值
string s4="hello"+"world";//錯(cuò)誤,不能這樣連接連個(gè)字符串字面值
char s5[]="world";
string s6=s1+s5;//正確,可以連接一個(gè)string對(duì)象和char數(shù)組
char s7[]="hello";
stirng s8=s7+s5;//錯(cuò)誤,不能這樣連接兩個(gè)char數(shù)組。
總而言之只能用+或+=連接兩個(gè)string對(duì)象或一個(gè)string對(duì)象和字符串字面值或一個(gè)string對(duì)象和char數(shù)組。
連接一個(gè)string對(duì)象和字符串字面值或char數(shù)組或返回的都是string對(duì)象,所以可以連接一個(gè)string對(duì)象和字符串字面值(或char數(shù)組)后再連接一個(gè)字符串字面值(或char數(shù)組)。
例如:
string s;//初始化為空
char s1[]="hello";
char s2[]="world";
s=s+s1+s2;//正確
上一篇:C++ new/delete相關(guān)知識(shí)點(diǎn)詳細(xì)解析
欄 目:C語(yǔ)言
本文標(biāo)題:c字符串,string對(duì)象,字符串字面值的區(qū)別詳解
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/4186.html
您可能感興趣的文章
- 01-10深入解析最長(zhǎng)公共子串
- 01-10C語(yǔ)言字符串操作總結(jié)大全(超詳細(xì))
- 01-10用c語(yǔ)言根據(jù)可變參數(shù)合成字符串的實(shí)現(xiàn)代碼
- 01-10如何用C語(yǔ)言去除字符串兩邊的空字符
- 01-10c語(yǔ)言字符數(shù)組與字符串的使用詳解
- 01-10使用C語(yǔ)言遞歸與非遞歸實(shí)現(xiàn)字符串反轉(zhuǎn)函數(shù)char *reverse(char *str
- 01-10c語(yǔ)言中用字符串?dāng)?shù)組顯示菜單的解決方法
- 01-10c++實(shí)現(xiàn)strcat字符串連接庫(kù)函數(shù)的方法詳解
- 01-10C++實(shí)現(xiàn)strcmp字符串比較的深入探討
- 01-10基于字符串移位包含的問(wèn)題詳解


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 04-02jquery與jsp,用jquery
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10delphi制作wav文件的方法
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?