C/C++中的字符串

 最近开始学习数据结构,于是写了一个String类型,用的是C++。其中定义了一个私有变量const char *str用来存储字符串。 不免得做一些字符串的管理,这里把我的认识与理解记下来:

在C中,字符串是以一种字符数组的形式存储的,比如说"Hello World!"在内存中的存储方式就是开辟了一段12 + 1个字节长的内存,顺序存储。值得注意的是,在字符的结尾,C会默认给这段字符加上一个标志结尾的字符'/0'。其实这条江湖规矩我早就知道了,可是一直没有放在心上,直到今天我想新开辟一段内存来拷贝一段字符串的时候我才比较仔细的体会到这一点。

假设我想拷贝一个字符串,"Hello World!",没数错的话一共是12 + 1个字符(算上终止符号'/0')。所以,我写了这么几行代码:
......
int len = strlen("Hello World!");    //获取字符串长度,注意,这个长度不会包括'/0',也就是说应该是12。
char *newStr = new char[len];    //分配一段内存,长度为len。
strcpy(newStr, "Hello World!");

cout << newStr << endl;
......
结果输出:
Hello World!
似乎正确,没什么问题,可是后来我将这几行写进一个比较大一点的程序就出现了问题,输出的结果是在"Hello World!"后多了一颗小红心。究其原因,我想可能是系统给字符串添加的终止符号'/0'以超出了动态分配的内存的范围,因为我们只分配了str("Hello World!")长的内存空间,所以哪个字节的值是未定义的,程序不能保证在任何时候都正确的输出。于是,我做了一下更改:
......
int len = strlen("Hello World!");    //获取字符串长度,注意,这个长度不会包括'/0',也就是说应该是12。
char *newStr = new char[len + 1];    //分配一段内存,长度为len + 1,预留一个字节给'/0'。
strcpy(newStr, "Hello World!");

cout << newStr << endl;
......
结果输出:
Hello World!

这里有个疑问,我们需要主动给字符串加一个终止符吗?比如:
......
int len = strlen("Hello World!");    //获取字符串长度,注意,这个长度不会包括'/0',也就是说应该是12。
char *newStr = new char[len + 1];    //分配一段内存,长度为len + 1,预留一个字节给'/0'。
strcpy(newStr, "Hello World!");
newStr[len] = '/0';

cout << newStr << endl;
......
结论是,不需要,应该是strcpy()已经给他默认的加上了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值