【char待整理】C++中string,char[]与char +关系、区别与转换

C++中string、char *、char[]的转换https://www.cnblogs.com/Pillar/p/4206452.html

strcpy(ebrstItem.EBRST_RptTime, tEbd.strEBDTime.c_str());
//将string转换成const char * 在拷贝给char[]

首先必须了解,string可以被看成是以字符为元素的一种容器。字符构成序列(字符串)。有时候在字符序列中进行遍历,标准的string类提供了STL容器接口。具有一些成员函数比如begin()、end(),迭代器可以根据他们进行定位。

注意,与char*不同的是,string不一定以NULL('\0')结束。string长度可以根据length()得到,string可以根据下标访问。所以,不能将string直接赋值给char*。

char *转换成string

可以直接赋值。

string s;
char *p = "adghrtyh";
s = p;

char[] 转换成string

可以直接赋值。

这里有一点要说明,当声明了string类型变量s后,用printf("%s",s);是会出错的,因为“%s”要求后面的对象的首地址。但是string不是这样的一个类型。所以肯定出错。

string 转换成 char *

如果要将string直接转换成const char *类型。string有2个函数可以运用。一个是.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编译不能通过。下面解释下该问题,const char*是不能直接赋值到char*的,这样编译都不能通过,理由:假如可以的话,那么通过char*就可以修改const char指向的内容了,这是不允许的。所以char*要另外开辟新的空间,即上面的形式。

那么,如果要转换成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;

string转换成char[]

这个由于我们知道string的长度,可以根据length()函数得到,又可以根据下标直接访问,所以用一个循环就可以赋值了。

这样的转换不可直接赋值。

string pp = "dagah";
char p[8];
int i;
for( i=0;i<pp.length();i++)
    p[i] = pp[i];
p[i] = '\0';
printf("%s\n",p);
cout<<p;

char[]数组该如何赋值

1、定义的时候直接用字符串赋值

char a[10]="hello";

注意:不能先定义再给它赋值,如char a[10]; a[10]="hello";这样是错误的!a虽然是指针,但是它已经指向在堆栈中分配的10个字符空间,现在这个情况a又指向数据区中的hello常量,这里的指针a出现混乱,不允许!

2、对数组中字符逐个赋值

char a[10]={'h','e','l','l','o'};

3、利用strcpy

char a[10]; strcpy(a, "hello");/*给数组赋字符串*/ .

strcpy

char * strcpy(char * strDest,const char * strSrc) 

strcpy函数:顾名思义字符串复制函数:

原型:extern char *strcpy(char *strDest,char *strSrc);

功能:把从strSrc地址开始且含有NULL结束符的字符串赋值到以strDest开始的地址空间,返回strDest(地址中存储的为复制后的新值)。要求:strSrc和strDest所指内存区域不可以重叠且strDest必须有足够的空间来容纳strSrc的字符串。

该函数的参数是字符指针,也就是可以是字符串变量和字符数组,因为它们的变量名代表首字符地址。字符串默认有一个null结束符,字符数组没有。所以此处需要注意:因为strSrc要求有null结束符,所以字符数组的长度必须大于等于src包含null结束符的总长度。例如,char* src="abcd"; char dest[5]; 这里dest的长度就至少为5。

char[]和char*区别

char a[20]=" hello world\n";

char *b=" hello world\n";

当字符数组未指定大小时,数组占用的空间其实就是数组内字符所占用的空间,一个字符一个字节。所以sizeof a的结果是字符数组实际存储数据的大小。

对于char*等于的指针,只要是求指针的大小的时候,它的值都是4,不管指针定义的类型。

当字符数组指定大小时,数组占用的空间就是它指定大小。char a[20]指定的大小是20,所以它占用的空间就是20字节。

若指针变量前有类型时,其结果等于1。*可以理解为一个地址类型,b才存放着另外一个变量的地址。sizeof *b

将a作为参数存入另一个函数中,在另一个函数中,size函数输出的结果会是多少呢?结果是4。其实coutsize(char a[])与coutsize(char *a)是一样的,它是不会为你记录数组的大小,而是传入了地址参数。

首先看指针:

char *p = “helloworld”;

    在这里p是一个变量,其类型为指针类型,并且指向一个字符串,字符串内容为”helloworld”,如果要访问p[2]的话,就需要先从p中取出地址,该地址为”helloworld”的首地址,然后再加上偏移量2,就得到了’l’这个字符,所以其访问的方式为先从p中取出地址,然后再将该地址加上偏移量,得到一个地址,最后从这个地址中取出值来。其分为三步:

1.取p的值,该值即为字符串的首地址;

2.该地址加上偏移量,得到所要取的字符的地址;

3.从这个地址中取得值。

此处p是一个变量,它自己是存放在一个地址中的,而它的内容则是”helloworld”这个字符串的地址. p与字符串是分开的。

    同时,该指针的值是动态确定的,必须在运行的时候才能确定其值,并通过该值访问到字符串。

    而如果是数组的话,则为

char p[20] = “helloworld”;

    在这里p为一个字符串的标识,其类型是一个字符数组的类型,且该数组有20个char类型的大小.此时如果要访问p[2]的话,分2步:

1.直接使用该字符数组的首地址加上2个char类型的大小的长度就得到了要访问的字符的地址;

2.最后再从这个地址中取出值来.而且此时p的地址为该字符数组的首地址,其内容为’h’,一个字符类型。

    所以在这个地方数组与指针是不相同的,因为此时数组取值的第一步并不是从p中读取地址来再加上偏移量的.此时的p这个地址的值就为’h’这个字符,其类型为字符型而不是一个指针类型.此时p的地址与p[0]的地址是相同的。

    同时,每个符号的地址在编译时就确定了,所以这里p的地址就已经确定了,如果需要访问p[2],则直接使用该地址加上2这个偏移量就可以取到这个值了.它不需要指令再取得这个首地址.而第一种情况下,还需要指令取得指针中的值,并通过这个值来访问字符串。

    一个直观的看法就是前一种是两个不同的, 而后一种则是在同一个里面。

    另外,还有一个不同之处在于第一个情况下 p 指向的是一个常量区, 是不能改变的, 即不能够对p[i]赋值, 而第二种情况下, p是一个字符数组, 其是可以改变的,可以对p[i]赋值的。

  他们俩*p的值是一样的,都是h字符!

---------------------

作者:johnny710vip

来源:CSDN

原文:https://blog.csdn.net/johnny710vip/article/details/6725637

版权声明:本文为博主原创文章,转载请附上博文链接!

 

最后,如果要把一个const char*的字符串赋给char*,不能用=号,只能用strcpy!!!

问题是这样产生的,先看这个函数原型:

1

void someFunc(char *someStr);

再看这个函数调用:

1

someFunc("I'm a string!");

把这两个东西组合起来,用最新的g++编译一下就会得到标题中的警告。

为什么呢?原来char *背后的含义是:给我个字符串,我要修改它。

而理论上,我们传给函数的字面常量是没法被修改的。

所以说,比较和理的办法是把参数类型修改为const char *。

这个类型说背后的含义是:给我个字符串,我只要读取它。

 

如何同时接收const类型和非const类型?重载

#include <iostream>

using namespace std;

int fuc(char *a)

{

cout << a << endl;

}

int fuc(const char *a)

{

cout << a << endl;

}

int main()

{

char a[] = "hello 123";

fuc(a);

const char b[] = "hello 123";

fuc(b);

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章