跳至主要內容

03. 字符类型

LincZero大约 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
    • 数组法
      • 性质:以空字符\0null character,ASCII为0)结尾,可以不显性标注(会自动补\0)
      • 自动填补:数组是填补0,而字符串是填补\0
      • 举例:char ac_dog[] = {'d', 'o', 'g', '\0'};
      • 如果不以空字符结尾:cout会一直输出知道遇到空字符为止(空字符在内存中很常见,这一个过程很快停止)
      • 缺点:冗长乏味(使用大量单引号),且必须记住加空字符
    • 字符串常量(string constant)或字符串字面值(string literal
      • 性质:以空字符\0null 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)还可以指出目标数组最大允许长度的第三个参数