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

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

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

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

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

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

區(qū)別: char *s1:s1是一個指向字符串的百科指針 char s2[]:s2是一個字符數(shù)組 string s3:s3是一個string類的對象 【內(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個函數(shù)可以運用。

一個是.c_str(),一個是.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對象的生命周期) 那么,如果要轉(zhuǎn)換成char*,可以用string的一個成員函數(shù)copy實現(xiàn)。

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

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

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

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

cha