string中c_str()的用法

1.

语法:

1 const char *c_str();

c_str()函数返回一个指向正规C字符串的指针常量, 内容与本string串相同。

这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。

注意:一定要使用strcpy()函数 等来操作方法c_str()返回的指针。

比如:最好不要这样:

1 char* c;
2 string s="1234";
3 c = s.c_str();

c最后指向的内容是垃圾,因为s对象被析构,其内容被处理,同时,编译器也将报错——将一个const char *赋与一个char *。

应该这样用:

1 char c[20];
2 string s="1234";
3 strcpy(c,s.c_str());

这样才不会出错,c_str()返回的是一个临时指针,不能对其进行操作。

再举个例子:

c_str() 以 char* 形式传回 string 内含字符串,如果一个函数要求char*参数,可以使用c_str()方法:

1 string s = "Hello World!";
2 printf("%s", s.c_str());    // 输出 "Hello World!"
#include
#include
#include
using namespace std;
int main()
{

char *c;
    string s1="zhanghong";
c=s1.c_str();

/*
string s1="zhanghong";
char c[20];
strcpy(c,s1.c_str());
    cout<   // strcpy()
    */
//    cout< return 0;

}

打印结果:

farsight@ubuntu:~/shell$ g++ cstr.cpp
cstr.cpp: In function ‘int main()’:
cstr.cpp:13:13: error: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive]

farsight@ubuntu:~/shell$ 

实例二:

#include
#include
#include
using namespace std;


int main()
{
/*
char *c;
    string s1="zhanghong";
c=s1.c_str();
*/

string s1="zhanghong";
char c[20];
strcpy(c,s1.c_str());
    cout<   // strcpy()
    
//    cout< return 0;

}

farsight@ubuntu:~/shell$ ./a.out
zhanghong
farsight@ubuntu:~/shell$ 

#include  
#include  
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;  

farsight@ubuntu:~/shell$ 


farsight@ubuntu:~/shell$ g++ cstr.cpp
farsight@ubuntu:~/shell$ g++ string.cpp
farsight@ubuntu:~/shell$ ./a.out
Chelse

Cmelse


string.c_str是Borland封装的String类中的一个函数,它返回当前字符串的首字符地址。

c_str函数的返回值是const char*的,不能直接赋值给char*,所以就需要我们进行相应的操作转化。

#include   
#include   
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;  
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

第一个输出 当然是 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.
  • 1
  • 2
  • 3

简而言之,调用任何 std::string 的非 const 成员函数以后,c_str() 的返回值就不可靠了。


你可能感兴趣的:(C++)