【C++】stringstream的str() 和 string的c_str()

std::stringstream::str

// stringstream::str
#include <string>       // std::string
#include <iostream>     // std::cout
#include <sstream>      // std::stringstream, std::stringbuf

int main () {
  std::stringstream ss;
  ss.str ("Example string");
  std::string s = ss.str();
  std::cout << s << '\n';
  return 0;
}

streamstring在调用str()时,会返回临时的string对象。而因为是临时的对象,所以它在整个表达式结束后将会被析构。

如果需要进一步操作string对象,先把其值赋给一个string变量后再操作。

 

std::string::c_str

// strings and c-strings
#include <iostream>
#include <cstring>
#include <string>

int main ()
{
  std::string str ("Please split this sentence into tokens");

  char * cstr = new char [str.length()+1];
  std::strcpy (cstr, str.c_str());

  // cstr now contains a c-string copy of str

  char * p = std::strtok (cstr," ");
  while (p!=0)
  {
    std::cout << p << '\n';
    p = std::strtok(NULL," ");
  }

  delete[] cstr;
  return 0;
}

c_str()函数返回一个指向正规C字符串的指针常量, 内容与本string串相同. 
这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。 

1.c_str是一个内容为字符串指向字符数组的临时指针; 
2.c_str返回的是一个可读不可改的常指针;

注意:一定要使用strcpy()函数 等来操作方法c_str()返回的指针 
比如:最好不要这样:

const char* func()
{
    const char* c; 
    string s="1234"; 
    c = s.c_str();   
    return c;      
}

因为从func()函数退出后,s 会被析构,返回的指针指向了无效区域。

 

上一篇:使用svcutil.exe 生成服务的代码


下一篇:[剑指offer]JT54---字符流中第一个不重复的字符(感觉前面做过,就是hash表呀,难道我肤浅了?)