string.c_str
是Borland
封装的String
类中的一个函数,它返回当前字符串的首字符地址。
c_str
函数的返回值是const char*
的,不能直接赋值给char*
,所以就需要我们进行相应的操作转化。
#include <iostream>
#include <string>
int main() {
std::string s = "Chelse";
const char *str = s.c_str();
std::cout << str << std::endl;
s[1] = 'm';
std::cout << str << std::endl;
return 0;
}
第一个输出 当然是 Chelse。
第二个输出呢: Chelse还是Cmelse呢?
答案是Cmelse。
const char*的值应该是个常量啊,怎么还能改变值呢?
这就是很多人遇到的坑儿,也许面试的时候你会顺利的回答出来,但是在实际的工程中,往往掉进坑儿里,难以自拔。
const char*
, char const*
, char* const
的区别是什么?
const char*
与char const*
是等价的,指的是指向字符常量的指针,即指针可以改变指向但其指向的内容不可以改变。
而char* const
相反,指的是常量指针,即指向不可以改变但指针指向的内容可以改变。
因此这里的const char*
指向的内容本类是不可以改变的。
那么这里为什么改变了呢?
这跟str
这个const char*
的生命周期及string
类的实现有关,string
的c_str()
返回的指针是由string
管理的,因此它的生命期是string
对象的生命期,而string
类的实现实际上封装着一个char*
的指针,而c_str()
直接返回该指针的引用,因此string
对象的改变会直接影响已经执行过的c_str()
返回的指针引用。
看下官方说法:
const charT* c_str() const;
Returns: A pointer to the initial element of an array of length size() + 1 whose first size() elements equal the corresponding elements of the string controlled by *this and whose last element is a null character specified by charT().
Requires: The program shall not alter any of the values stored in the array. Nor shall the program treat the returned value as a valid pointer value after any subsequent call to a non-const member function of the class basic_string that designates the same object as this.
简而言之,调用任何 string
的非 const
成员函数以后,c_str()
的返回值就不可靠了。即指向的内容本类可能会改变。
那么,回到主题。
c_str()
函数,就可以把C++
的string类型变成C的字符数组,,然后就可以用scanf()/printf()函数,进行输入/出。其中用%s
。