char*、char[]及string的區別及相互轉換
阿新 • • 發佈:2019-02-04
區別:
char *s1:s1是一個指向字串的指標; char s2[]:s2是一個字元陣列; string s3:s3是一個string類的物件. 【記憶體模型】 例如: char *s1 = "hello";char s2[] = "hello";
記憶體模型如下 +-----+ +---+---+---+---+---+---+
s1: | *======> | h | e | l | l | o |\0 |
+-----+ +---+---+---+---+---+---+
+---+---+---+---+---+---+
s2: | h | e | l | l | o |\0 |
+---+---+---+---+---+---+
轉換:
1.string轉換為char *:- 如果要將string直接轉換成const char *型別。string有2個函式可以運用。
一個是.c_str(),一個是.data成員函式。
例子如下:string s1 = "abcde"; const char *k = s1.c_str(); const char *t = s1.data(); printf("k:[%s] t:[%s]\n", k, t); system("pause");
如上,都可以輸出。內容是一樣的。但是隻能轉換成const char*,如果去掉const編譯不能通過。(const char *指向的記憶體依賴string物件的生命週期) - 那麼,如果要轉換成char*,可以用string的一個成員函式copy實現。(因為記憶體是char *獨立維護的,新申請的。等價於兩份拷貝)
string s1 = "abcde"; char *data; int len = s1.length(); data = (char *)malloc((len + 1)*sizeof(char)); s1.copy(data, len, 0); data[len] = '\0'; printf("data:%s\n", data); printf("s1:%s\n", s1.c_str());
char *p = "adghrtyh";
s = p;
注: 當我們定義了一個string型別之後,用printf("%s",s);輸出是會出問題的。這是因為“%s”要求後面的物件的首地址。但是string不是這樣的一個型別。所以肯定出錯。用cout輸出是沒有問題的,若一定要printf輸出。那麼可以這樣:printf("%s",s.c_str())。
3.char[] 轉換成string: 同char *轉換成sting 4、string轉換成char[]:
char buf[10];
char nbuf[10];
string str("abcdeg");
strcpy(buf, str.c_str());
strncpy(nbuf, str.c_str(), str.length());
buf[str.length()] = '\0';
nbuf[str.length()] = '\0';
printf("buff:[%s] nbuff:[%s].\n", buf, nbuf);
5、QString 轉換為 const char *:
(const char *)(QString).toLocal8Bit();
總結: 通過上述的轉換可以發現,其核心仍是緊緊抓住了三者之間的區別。我們應從三者的區別入手,去體會他們之間的轉換。
參考文章:
推薦閱讀: