1. 程式人生 > >char*、char[]及string的區別及相互轉換

char*、char[]及string的區別及相互轉換

區別:

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());

2.char *轉換成string: 可以直接賦值(是記憶體拷貝賦值 string s;
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();
總結: 通過上述的轉換可以發現,其核心仍是緊緊抓住了三者之間的區別。我們應從三者的區別入手,去體會他們之間的轉換。

參考文章:

推薦閱讀: