C风格字符串:本质上就是以空字符null为结束符的数组
可以简单的理解为:有‘\0‘的是c风格字符串,无‘\0‘的是普通字符数组
字符串字面值:是一串常量字符,字符串字面值常量用双引号括起来的零个或多个字符表示。
C++字符串:通俗而言是string类,为和c语言兼容,C++中所有的字符串字面值都由编译器自动在末尾添加一个空字符。(实际上在c++中,string最好直接理解为一个基本类型,相关操作都封装在string类中,避免使用char *出错)
由下面的代码可以看出:
int main() { char str1[5] = {‘H‘,‘e‘,‘l‘,‘l‘,‘0‘}; char str2[6] = {‘H‘,‘e‘,‘l‘,‘l‘,‘0‘}; //char str3[5] = "Hello"; //error char str4[6] = "Hello"; cout << sizeof(str1) << endl; //5 cout << sizeof(str2) << endl; //6 cout << strlen(str1) << endl; //19 cout << strlen(str2) << endl; //5 cout << strlen(str4) << endl; //5 cout << str1 << endl; //Hell0烫烫烫潭9媭? cout << str2 << endl; //Hell0 cout << str4 << endl; //Hell0 char str5[12] = {‘H‘,‘e‘,‘l‘,‘l‘,‘0‘}; char str6[] = {‘H‘,‘e‘,‘l‘,‘l‘,‘0‘}; cout << sizeof(str5) << endl; //12 cout << sizeof(str6) << endl; //5 cout << str5 << endl; //Hell0 cout << str6 << endl; //Hell0烫烫烫潭9媭? char str7[12] = "Hello"; char str8[] = "Hello"; cout << sizeof(str7) << endl; //12 cout << sizeof(str8) << endl; //6 cout << strlen(str8) << endl; //5 string str9 = "Hello"; cout << str9.size() << endl; //5 }
写成“Hello”形式时,都必须给‘\0‘预留空间(必须有),要不然会直接报错,其sizeof大小为6,但是其strlen为5(说明这种形式的时候会自动加一个‘\0‘,sizeof是求变量占用空间,因此带上‘\0‘大小,strlen是只计算有效字符个数,null之前字符个数)
如果char *数组大小和字符个数相等时(或者未显示分配大小):分开来写成{‘H‘,‘e‘,‘l‘,‘l‘,‘0‘}形式时,其数组大小可以直接和字符个数相等,其sizeof就是字符个数,不会自动补齐‘\0’,但是打印或者处理的时候,因为找不到结束符,因此会处理到其他内存的内容,有很大的隐患。
如果char *数组大小大于字符个数,则也会补一个‘\0’
因此以char *形式处理字符串的时候一定要注意结束符以及是否溢出,如果空间预留过大又浪费空间
而且修改或者特殊查询的时候还得创建副本
而string则不需要注意这些,空间对象如何分配,是否要创建副本由类内部处理,用户可以当作普通变量处理,而且string作为c++标准库,有很多方法都有现成的,直接在API上就可以查询到,方便快捷
时间: 2024-10-10 15:16:17