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(对于宽字符)等等;当然,你愿意的话也可以编写自己的库函数。
以下三个字符串是不同的:
“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(对于宽字符)等等;当然,你愿意的话也可以编写自己的库函数。