C字符串详解

1、C字面值字符串类型(本条针对于C99):
     以下三个字符串是不同的:
           “XXXXXX”
            (char []){"XXXXXX"}
            (const char []){"XXXXXX"}
第一个总是有一个静态存储期,并且类型为char型的数组,不能被修改。后两个如果他们出现在一个函数体中时,有一个自动存储期;且这两个中的第一个是可以修改的。其中,这三个字符串的类型都是char[7],其中后两个是C99标准中增的语法。

最佳实践:对于C99,当在一个函数中使用不可以修改的常量字符串时,应尽量使用第三种,因为当出了他的作用域(即不在使用它)时,该字符串所占用的空间将被释放;而如果用第一种的话,它是静态的,它的空间在程序被编译时分配,程序结束时释放,这样在不用它时浪费了存储空间。当然,对于C89(或称为C90)、C95(C90的修订案1)而言,只能用第一种形式了。

2、C语言中字符串比较时的陷阱
尽管我们可以使用诸如"abc" == "abc"方式来判断两个字符串是否相等,但我们不应该“偷懒“而依赖这种方式。
原因:字符串在C中被解释为字符数组,而字符数组的数组名又可以被解释为指针,所以当两个常规的字面字符串用“==”来进行比较时,相当于比较的是两个字符数组的地址;而为什么我们比较的时候会是相同的呢?这是因为,编译器可能会共享这些相同的字面字符串,即对这些字面字符串的使用其实是同一个字符串(换句话说就是,比较的是同一个内存的地址值),尽管不是我们的本意;但是,要注意,C标准并没有要求所有的编译器这么做,只是说明编译器可以这么做(有的编译器可能会给出警告),但我们不能信赖于此。相反,我们应该使用标准库函数strcmp或strncmp、wcscmp或wcsncmp(对于宽字符)等等;当然,你愿意的话也可以编写自己的库函数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值