首页天道酬勤string转化成char,将字符串转换为数组

string转化成char,将字符串转换为数组

张世龙 05-06 13:39 34次浏览

第一部分:

将char *或char []转换为字符串

可以直接分配和转换值。

第二部分:

将字符串转换为char *或char []

string是c标准库中的一个,封装了对字符串的操作

将string转换为char*后为3种方法

1. 调用 string 的 data 函数

例如:

stringstr='abc ';

char*p=str.data (;

2.调用 string 的 c_str 函数

例如,stringstr='gdfd ';

char*p=str.c_str (;

3 调用 string 的 copy 函数

例如

stringstr='hello ';

charp[40];

str.copy(p,5,0 ); //其中5表示要复制一些字符,0表示要复制到的*(p+5)='/0'; //要手动加上结束符

coutp;

语法: const char *c_str (; c_str ) )函数返回指向与此string字符串内容相同的正则c字符串的指针。 这是为了与c语言兼容,因为c语言没有字符串类型,所以必须使用字符串类型对象的成员函数c_str ) )将字符串对象转换为c中的字符串样式。 注意:方法c_str (返回的指针必须使用strcpy ) )函数等进行操作。 例如,最好不要这样: char* c。 字符串s=' 1234 '; c=s.c_str (; //c最后指示的内容是垃圾,s对象被析构,其内容处理时应这样使用: char c[20]; 字符串s=' 1234 '; srcpy(c,s.c_str ) ); 这样就没错了。 c_str ) )返回临时指针。 你不能操作这个。 作为另一个示例,c_str ) )以char*的形式返回字符串包含字符串。 如果函数请求char*参数,请使用c_str ) )方法。 strings='Helloworlllo; printf('%s ',s.c_str ) ); //输出' Hello World! '

1、要将string转换为char*,请使用string提供的函数c_str (或函数data ) )。 除了data返回字符串的内容外,不附加终止符“\0”,c_str ) )还返回以“\0”结束的字符数组。 2、const char *c_str (; c_str ) )函数返回指向正规c字符串的指针。 内容与此string字符串相同。 这是为了与c语言兼容,因为c语言没有字符串类型,所以必须使用字符串类型对象的成员函数c_str ) )将字符串对象转换为c的字符串样式。 注意:请务必使用strcpy ) ) string s='1234 '; c=s.c_str (; //c最后指示的内容是垃圾,s对象被析构,其内容处理时应这样使用: char c[20]; 字符串s=' 1234 '; srcpy(c,s.c_str ) ); 这样就没错了。 c_str ) )返回临时指针。 你不能操作这个。 作为另一个示例,c_str ) )以char*的形式返回字符串包含字符串。 如果函数请求char*参数,请使用c_str ) )方法。 strings='Helloworlllo; printf('%s ',s.c_str ) ); //输出' Hello World! ' http://有时在www.Sina.com /字符串中遍历,标准的string类提供STL容器接口。 具有begin (,end ),等成员函数,迭代器可根据他们定位。

请注意,与char*不同,字符串不一定以NULL('\0”)结尾。 string的长度由length ()得出,string可以通过下标访问。 因此,不能将字符串直接分配给char*。

1、首先必须了解,string可以被看成是以字符为元素的一种容器。字符构成序列(字符串)。

将字符串直接转换为常数字符*类型时。 string有两个函数。

一个是。

c_str(),一个是data成员函数。

例子如下:

string s1 = "abcdeg";
const char *k = s1.c_str();
const char *t = s1.data();
printf("%s%s",k,t);
cout<<k<<t<<endl;

如上,都可以输出。内容是一样的。但是只能转换成const char*,如果去掉const编译不能通过。

那么,如果要转换成char*,可以用string的一个成员函数copy实现。

string s1 = "abcdefg";
char *data;
int len = s1.length();
data = (char *)malloc((len+1)*sizeof(char));
s1.copy(data,len,0);
printf("%s",data);
cout<<data;

 

3、char *转换成string

可以直接赋值。

string s;

char *p = "adghrtyh";

s = p;

不过这个是会出现问题的。

有一种情况我要说明一下。当我们定义了一个string类型之后,用printf("%s",s1);输出是会出问题的。这是因为“%s”要求后面的对象的首地址。但是string不是这样的一个类型。所以肯定出错。

用cout输出是没有问题的,若一定要printf输出。那么可以这样:
printf("%s",s1.c_str())

              备注:

string::c_str()、string::data()的区别:

const value_type *c_str( ) const;

const value_type *data( ) const;

 

data只是返回原始数据序列,没有保证会用traits::eos(),或者说'\0'来作字符串结束.   当然,可能多数实现都这样做了。   

c_str是标准的做法,返回的char*   一定指向一个合法的用'\0'终止的C兼容的字符串。   
所以,如果需要C兼容的字符串,c_str  是标准的做法,data  并不保证所有STL的实现的一致性

 

你或许会问,c_str()的功能包含data(),那还需要data()函数干什么?看看源码:
const charT* c_str () const
{

   if  (length () == 0)

        return "";

   terminate ();

   return data ();

}
原来c_str()的流程是:先调用terminate(),然后在返回data()。因此如果你对效率要求比较高,而且你的处理又不一定需要以\0的方式结束,你最好选择data()。但是对于一般的C函数中,需要以const char*为输入参数,你就要使用c_str()函数。
对于c_str() data()函数,返回的数组都是由string本身拥有,千万不可修改其内容。其原因是许多string实现的时候采用了引用机制,也就是说,有可能几个string使用同一个字符存储空间。而且你不能使用sizeof(string)来查看其大小。详细的解释和实现查看Effective STL的条款15:小心string实现的多样性。
另外在你的程序中,只在需要时才使用c_str()或者data()得到字符串,每调用一次,下次再使用就会失效,如:
string strinfo("this is Winter");
...
//最好的方式是:
foo(strinfo.c_str());
//也可以这么用:
const char* pstr=strinfo.c_str();
foo(pstr);
//不要再使用了pstr了, 下面的操作已经使pstr无效了。
strinfo += " Hello!";
foo(pstr);//错误!
会遇到什么错误?彪壮的发带幸运的时候pstr可能只是指向"this is Winter Hello!"的字符串,如果不幸运,就会导致程序出现其他问题,总会有一些不可遇见的错误。总之不会是你预期的那个结果。

 

 strcpy

C语言标准库函数strcpy,把从 src地址开始含有'\0'结束符的字符串 复制  到  以 dest开始的地址空间
c++ string,char拼接成string