C++ 中c_str()函數


轉載:

1.https://blog.csdn.net/chaipp0607/article/details/75371149

2.https://blog.csdn.net/JIEJINQUANIL/article/details/51547027

 

 

 

先舉個例子說明一下:

atoi()是C語言中的字符串轉換成整型數的一個函數,在例子的代碼里面會用到,其函數原型為:

int atoi(const char *nptr);

 

下面是一個C語言的代碼,可以正常運行:

 

#include <stdio.h>
#include <stdlib.h>

 

int main()

    char *str = "123";
    int num = atoi(str);
    printf("%d\n",num);
    getchar();
    return 0;
}

 

但是在C語言中使用字符串遠遠沒有C++方便,畢竟C++提供了string類,把代碼改成C++版:

 

//這是個錯誤的代碼
#include <iostream>
#include <string>

 

using namespace std;

 

int main()

    string str ="123";
    int num = atoi(str);
    cout<<num<<endl;
    getchar();
    return 0;
}

此時代碼會報錯,因為string與const char類型是不符的,前面提到,atoi()是C語言提供的函數,而C語言中沒有string類,字符串使用char指針來實現的。

C與C++本身就是一家,為了讓它們在一定程度上可以通用,就有了.c_str()函數。我們只需要把代碼修改成這樣:

//這是個正確的代碼
#include <iostream>
#include <string>

using namespace std;

int main()

    string str ="123";
    int num = atoi(str.c_str());
    cout<<num<<endl;
    getchar();
    return 0;
}

 

 

就是在string類型的str后面加上了.c_str()函數,這也就是.c_str()的作用:
.c_str()函數返回一個指向正規C字符串的指針常量, 內容與本string串相同。因為string類本身只是一個C++語言的封裝,

其實它的string對象內部真正的還是char緩沖區,所以.c_str()指向了這個緩沖區並返回const。

    const _Elem *c_str() const
        {   // return pointer to null-terminated nonmutable array
        return (_Myptr());
        }

 

 

 

 

 

 

C++中c_str()函數的用法

 1、標准庫的string類提供了3個成員函數來從一個string得到c類型的字符數組:c_str()、data()、copy(p,n)。

        2、c_str()是Borland封裝的String類中的一個函數,它返回當前字符串的首字符地址。換種說法,c_str()函數返回一個指向正規C字符串的指針常量,內容與本string串相同。這是為了與C語言兼容,在C語言中沒有string類型,故必須通過string類對象的成員函數c_str()把string對象轉換成C中的字符串樣式。

      3、c_str()的原型是:const char*c_str() const;

      4、c_str()生成一個const char*指針,指向以空字符終止的數組。(data()與c_str()類似,但是返回的數組不以空字符終止。)

      5、注意:一定要使用strcpy()等函數來操作c_str()返回的指針。例如下面這樣寫就是錯誤的:


char* c;
string s="1234";
c = s.c_str();
      上述代碼中,c最后指向的內容是垃圾,因為s對象被析構,其內容被處理,同時編譯器將會報錯。正確代碼如下:

char *cstr,*p;
string str ("Please split this phrase into tokens");
cstr = new char [str.size()+1];
strcpy (cstr, str.c_str());
          6、如果一個函數要求char*參數,可以使用c_str()方法。
       7、copy(p,n,size_type _Off = 0):從string類型對象中至多復制n個字符到字符指針p指向的空間中。默認從首字符開始,但是也可以指定,開始的位置(記住從0開始)。返回真正從對象中復制的字符。第三個參數可以缺省。以下代碼顯示了copy()函數的用法:


string str ("Please split this phrase into tokens");
basic_string <char>:: size_type cc;
char arr[20] = {0};
basic_string <char>:: pointer arrayPtr = arr;
cc = str.copy(arrayPtr,10);
cout << "The number of copied characters in cc is: "<< cc << endl;
cout << "The copied characters array1 is: " << arrayPtr << endl;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM