首页 新闻 会员 周边

C++中char字符串 是否等价于 string

0
悬赏园豆:5 [已解决问题] 解决于 2014-09-10 11:37

比如 char name[20]=“whos your daday”

 和 string name="whos your daday"

从数值类型,存储结构,还有一些比较,遍历上他们的区别,求详解。本人C++新手

CTRA王大大的主页 CTRA王大大 | 初学一级 | 园豆:30
提问于:2014-09-02 09:19
< >
分享
最佳答案
0

你所说的string应该指std::string。

std::string不等价于char数组,std::string是一个类,char数组就是数组……

“数值类型”应该指每个字符的类型,当然是char;
或者你在问用下标索引的值是否一致('A'<->65),都是char的引用,当然一致。

char数组就是顺序存储结构;std::string也应该是是顺序存储结构,但我不确定会不会有很奇妙的实现。

std::string,作为一个类,实例化以后你就能对实例做各种各样的事情了(参见http://www.cplusplus.com/reference/string/string/);
char数组,数组能怎么用就怎么用。

 

说到遍历,一种是用下标索引遍历,C++11中规定std::string的下标运算符复杂度为常数,因此这种遍历方法效率不会有什么区别;std::string有迭代器,是随机访问迭代器,因此可以用“for (std::string::iterator i = str.begin(); i != str.end(); i++)”这一类方式遍历std::string(C++11可以更爽,但这里先不提)。

 

实际上char数组和std::string没什么可比的,因为是本质不同的东西。
但作为新手,敢于发问是一件好事,我就因为不太敢“问”丢掉了蛮多的学习机会。

收获园豆:5
Chielo Newctle | 初学一级 |园豆:177 | 2014-09-02 20:33

当时主要是纠结于'\0',现在自己写了一个,但是还没总结全。http://www.cnblogs.com/holyson/p/3951839.html

欢迎给予补充。

ps:语言方面不算新手了,所以问的比较细,C#,C,obj-C,js 这些都恨深度的研究过,所以现在对C++也是比较认真从底层学好。

CTRA王大大 | 园豆:30 (初学一级) | 2014-09-03 14:12

@凡图: std::string下标索引时,如果下标等于std::string的长度时,C++98和C++11都会返回字符'\0'的引用,当然,最好不要修改返回的这个引用。但是std::string::at的行为并非如此,它会抛出out_of_range异常。

Chielo Newctle | 园豆:177 (初学一级) | 2014-09-03 20:10

@凡图: 在C++98中std::string::data返回指向std::string内容的第一个字符的指针,但不保证结尾有'\0'。相反,C++11中的std::string::data以及两个版本的std::string::c_str会有这样的保证,甚至可以说,在C++11中std::string::c_str等价于std::string::data。

Chielo Newctle | 园豆:177 (初学一级) | 2014-09-03 20:13

@凡图: 作为指向std::string内容的std::string::iterator,从std::string::begin一直迭代到std::string::end,结尾不会有字符'\0'的(那是当然,有std::string::end就不必要用'\0'标记结尾了)。

Chielo Newctle | 园豆:177 (初学一级) | 2014-09-03 20:19

@Chielo Newctle: 你说的这东西太复杂了,我认为分析一个东西就应该一针见血,多一个字都是浪费。

我还是自己再看看书理解下吧。

CTRA王大大 | 园豆:30 (初学一级) | 2014-09-03 20:23

@凡图: 书本什么的扔到一边去吧,毕竟都是老的东西了。http://www.cplusplus.com/reference/string/string/,在这里能找到你想要的东西。

Chielo Newctle | 园豆:177 (初学一级) | 2014-09-03 20:37
其他回答(4)
0

对。

在C里面,字符串的定义是:

char* name = "whos yourdaday";

 

先定义字符数组:

char name[20] = "whos your daday";

则可以:

char *name = name;

或者

char *name = &name[0];

519740105 | 园豆:5810 (大侠五级) | 2014-09-02 09:27
0

自己动手写一下就可以了。

晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-02 09:33
0

char name[20] 表示长度为 20 个字节的定长数组或定长字符串。

string name = "whos your daday",表示一个字符串对象,其内部会分配 strlen("whos your daday")+1 个字节的 buffer,最后一个字节会自动填充为 0。

Launcher | 园豆:45045 (高人七级) | 2014-09-02 10:27

 应该叫空字符('\0')吧,我看书比较严谨和较真,呵呵

支持(0) 反对(0) CTRA王大大 | 园豆:30 (初学一级) | 2014-09-03 14:13

@凡图: 你说的也没错。因为我前面说的是分配多少个字节,所以我最后说填充 0,如果我说分配多少个字符,那么就可以说填充 '\0'

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-09-03 15:21
0

String 是个类,分配内存的时候还要为他分配属性占用的空间.

char name[20]是个基本单位组成的数组,分配内存的时候不用考虑属性这些问题.

贪心狸猫 | 园豆:872 (小虾三级) | 2014-09-02 12:54
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册