03. 字符类型
大约 4 分钟
03. 字符类型
char
参见整型
复合类型 > 直接使用类 > 字符串
其实也是一种特殊的容器类型
简概
原理:字符串的变量名本质上存储的是一个地址(存储形式为字符串)
当输出时,不输出地址,而是输出地址所表示的东西
原理的验证实验:
cout << ac_dog4[0] << "\t" // 输出单个字符
<< &ac_dog4 << "\t" // 输出地址
<< &ac_dog4 + 0 << "\t" // 输出地址
<< hex << long(&ac_dog4[0]) << dec // 输出地址
<< ac_dog4 << "\t" // 输出字符串
<< &ac_dog4[0] << "\t" // 输出字符串
<< endl;
使用
字面量方式
- C-风格字符串(C-style string)
- 数组法
- 性质:以空字符
\0
(null character,ASCII为0)结尾,可以不显性标注(会自动补\0) - 自动填补:数组是填补0,而字符串是填补
\0
- 举例:
char ac_dog[] = {'d', 'o', 'g', '\0'};
- 如果不以空字符结尾:
cout
会一直输出知道遇到空字符为止(空字符在内存中很常见,这一个过程很快停止) - 缺点:冗长乏味(使用大量单引号),且必须记住加空字符
- 性质:以空字符
- 字符串常量(string constant)或字符串字面值(string literal)
- 性质:以空字符
\0
(null character,ASCII为0)结尾,可以不显性标注(字符串本来就隐式包括结尾的空字符) - 自动填补:数组是填补0,而字符串是填补
\0
- 举例:
char ac_dog[] = {"dog"}
=char ac_dog[4] = {"dog"}
=char ac_dog[4] = {'d','o','g','\0'}
- 注意:通常要多预留一位给空字符串,上面几种写法是等价的==(把4改成3会报错,拿不准数量时最好是让程序自动填充长度)==
- 性质:以空字符
- 数组法
- 基于string类库的方法:见后
符号操作(与Java不同)
- 拼接字符串:用空白(空格、制表符、换行符)分隔的字符串常量会自动拼接成一个(Java中使用
+
号拼接)- 举例:
cout << "d" "og";
- 举例:
内置函数方法
计算长度:
strlen()
,计算数组中字符串的长度,到第一个空字符时停止且不计算后续内容的长度(sizeof
则是整个数组的长度)只能计算
char[]
类型,不能计算其他数组类型比较:
strcmp()
(不能使用==
比较,因为会被解释为地址,但string类可以)- 若相同:返回零
- 若第一个字符串按字母顺序排在第二个字符串之前:返回负数
- 若第一个字符串按字母顺序排在第二个字符串之后:返回正数
String
String类 - 简概(新)(C++新增)
头文件:C++的String类需要包含头文件
string
,string类位于名称空间std
中string类与字符数组区别:string类定义隐藏了字符串的数组性质,可以像处理普通变量那样处理字符串
本质:模板类 & 动态数组(动态联结)
String类 - 使用(新)(C++新增)
字面量方式
定义
支持C-风格字符串定义,
string str = "dog";
可以使用cin来存储,
cin >> str;
可以使用列表初始化,
string str = {"dog"};
”其他形式的字符串字面量值“:略
其他定义方法
string s1(); // s1 = "" string s2("Hello"); // s2 = "Hello" string s3(4, 'K'); // s3 = "KKKK" string s4("12345", 1, 3); // s4 = "234",即 "12345" 的从下标 1 开始,长度为 3 的子串
string对象和字符数组区别(优点)
- 声明:可以将string对象声明为简单变量,而不是数组
- 赋值:可以直接将一个string对象赋值给另一个(而不能将一个数组赋值给另一个)
- 拼接字符串:用
+
拼接,如str = s1 + s2
(数组无该方法,只能依靠cout
拼接) - 附加:可以使用
+=
附加,如str += s1
(数组无该方法)
CString
cstring类 - 简概(旧)
- 头文件:在早期C++新增string类之前,可以使用C的string库
cstring
(以前的string.h),没有名称空间
cstring类 - 使用(旧)
函数方法(
cstring
库)
strcpy(charr1, charr2)
,可以将字符串拷贝到字符数组中strncpy(charr1, charr2, len)
还可以指出目标数组最大允许长度的第三个参数strcat(charr1, charr2)
,可以将字符串附加到字符数组结尾strncat(charr1, charr2, len)
还可以指出目标数组最大允许长度的第三个参数