轉載:
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;