C++学习笔记----Strings与String View(1)

1、C中的字符串就是以NUL结尾的字符序列,使用不当会带来缓存溢出,安全性较差;C++中的Strings安全且简单易用,能克服以上缺点。C++中的Strings可以任意扩展其长度,截取子字符串,替换字符串,而C语言中却没有这种一种数据类型,其字符串只是字节的固定阵列,没有边界检查。

2、在C中使用字符串序列最容易犯的一个错误就是忘记给NUL分配空间,如:char myString[5] = "Hello";就是典型错误,好在现在编译器已足够智能,在编译阶段就能够识别出该错误: E0144    "const char [6]" 类型的值不能用于初始化 "char [5]" 类型的实体;将5修改为6之后就正确了: char myString[6] = "Hello";在进行strcpy()、strncpy()、strcat()时,一定要记得对实际操作的字符数(strlen())进行+1的操作考虑,否则会造成缓存溢出或其他不可预知的错误。

3、sizeof()与strlen():在C中操作字符串取其长度时,要尽量使用strlen()而不要使用sizeof(),大家知道sizeof(char)返回1,而sizeof()操作一个C类型的字符串时,其返回值是不确定的,如果其声明及定义为char[]类型,其sizeof()比strlen()多1,如:

char myString1[] { "abcdef"};
size_t s1 { sizeof(myString1) };    //值为7
size_t s2 { strlen(myString1) };    //值为6

而如果其声明及定义为 char*,则sizeof()返回的是指针的长度,在32位模式下返回的是4,64位模式下返回的是8;如下:

const char* myString2 { "abcdef" };
size_t s3 { sizeof(myString2) };    //32位模式为4,64位模式为8
size_t s4 { strlen(myString2) };    //值为6

4、完整的C模式的字符串操作函数参见<cstring>头文件;以前有旧有C模式的字符串操作函数可能迁移到C++中,经过修改,虽然可能可以运行,但编译时可能会报大量的warning,对于我这样的偏执类型的人而言,觉得warning也不可忍受,可以考虑使用如strcpy_s()、strcat_s()之类的安全类型;当然,最终的解决方案是使用C++的strings。

5、字符串声明及定义一般情况下是进行常量定义,即使没有用const,如果使用char *进行声明及定义,其值是不可修改的,如下代码一般的编译器是报错的,即使不报错,其结果也不能修改其值,结果不可预知:

char* Stringptr { "hello" };
ptr[1] = 'a';

正常的对字符串的定义如下,当然,其值不可修改:

const char* Stringptr { "hello" };
ptr[1] = 'a';    //错误,其值不可修改

如果就是要对其值进行修改,可使用char[]进行声明及定义:

char myString[] { "hello" };
myString[1] = 'a';

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值