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上就可以查询到,方便快捷