c/c++中string與char的區(qū)別,它們之間如何相互轉(zhuǎn)換!

c/c++中string與char的區(qū)別,它們之間如何相互轉(zhuǎn)換!

在C語言中,string 是定義一個(gè)字符串,存儲(chǔ)的是一段如“abcd”的數(shù)據(jù),而且**還有一個(gè)結(jié)束符\’\\0\’;char 是定義一個(gè)字符,存儲(chǔ)一個(gè)字符,占一個(gè)字節(jié)。
在C++中,string有兩種,一種是字符串char[],另外一種是封裝好的字符串類,要區(qū)別理解。

例如\’a\’是char, \”a\”是char string,這兩者都是普通的字符和字符串,和C語言中沒什么不同值得注意的是后者包含兩個(gè)字符,末尾有一個(gè)隱身的\’\\0\’而 string str = \”a\” 是C++ 封裝好的string。

C++中的char string和string不是一回事。當(dāng)用到了\”string\”這個(gè)關(guān)鍵詞,就不是普通的字符串,而是用到了封裝后的類。在C++中,char仍然是一個(gè)primitive type(原始類型),而string已經(jīng)經(jīng)過封裝,成為了一個(gè)class(類)用到它時(shí),我們需要 #include <string>,它是C++ Standard Library (C++標(biāo)準(zhǔn)庫)的一部分。

C++中 string和char* 和char[]的區(qū)別和使用

區(qū)別: char *s1:s1是一個(gè)指向字符串的百科指針 char s2[]:s2是一個(gè)字符數(shù)組 string s3:s3是一個(gè)string類的對(duì)象 【內(nèi)存模型】 例如: char *s1 = \”hello\”; char s2[] = \”hello\”; 內(nèi)存模型如下 +—–+ +—+—+—+—+—+—+ s1: | *======> | h | e | l | l | o |\\0 | +—–+ +—+—+—+—+—+—+ +—+—+—+—+—+—+ s2: | h | e | l | l | o |\\0 | +—+—+—+—+—+—+ 轉(zhuǎn)換: 1.string轉(zhuǎn)換為char *: 如果要將string直接轉(zhuǎn)換成const char *類型。string有2個(gè)函數(shù)可以運(yùn)用。

一個(gè)是.c_str(),一個(gè)是.data成員函數(shù)。

例子如下: string s1 = \”abcde\”; const char *k = s1.c_str(); const char *t = s1.data(); printf(\”k:[%s] t:[%s]\\n\”, k, t); system(\”pause\”); 如上,都可以輸出。內(nèi)容是一樣的。但是只能轉(zhuǎn)換成const char*,如果去掉const編譯不能通過。(const char *指向的內(nèi)存依賴string對(duì)象的生命周期) 那么,如果要轉(zhuǎn)換成char*,可以用string的一個(gè)成員函數(shù)copy實(shí)現(xiàn)。

(因?yàn)閮?nèi)存是char *獨(dú)立維護(hù)的,新申請(qǐng)的。等價(jià)于兩份拷貝) 2.char *轉(zhuǎn)換成string: 可以直接賦值(是內(nèi)存拷貝賦值) string s; char *p = \”adghrtyh\”; s = p; 注: 當(dāng)我們定義了一個(gè)string類型之后,用printf(\”%s\”,s);輸出是會(huì)出問題的。這是因?yàn)椤?s”要求后面的對(duì)象的首地址。

但是string不是這樣的一個(gè)類型。所以肯定出錯(cuò)。用cout輸出是沒有問題的,若一定要printf輸出。

那么可以這樣:printf(\”%s\”,s.c_str())。

C++中char* 和string的區(qū)別是?

cha