lecture11一字符串 绳伟光 上海交通大学微纳电子学系 2017年04月07日
lecture 11 —— 字符串 绳伟光 上海交通大学微纳电子学系 2017年04月07日
内容 ■字符串 ■字符串函数 8 2
字符串 字符串函数 内容 2
字符串(String简介 字符串包括字符串常量(string constants,or literals in C standard)和字符串变量(string variables) 字符串:Strings are arrays of characters in which a special character(the null character)marks the end ■C标准库另提供了一系列操作字符串的函数 3
3 字符串(String)简介 字符串包括字符串常量(string constants, or literals in C standard)和字符串变量(string variables) 字符串:Strings are arrays of characters in which a special character(the null character)marks the end C标准库另提供了一系列操作字符串的函数
字符串字面量(String Literals) 字符串字面量是一系列括在双引号内的字母,可表示 有意义或无意义的句子 "When you come to a fork in the road,take it." ■字符串字面量中可以包含转义序列,就像在printf和 scanf的格式串中那样 ■ 包含转义序列字符串示例: "Candy\nls dandy\nBut liquor\nls quicker.\n --Ogden Nash\n" 实际打印出来效果如下: Candy Is dandy But liquor Is quicker. --Ogden Nash
4 字符串字面量(String Literals) 字符串字面量是一系列括在双引号内的字母,可表示 有意义或无意义的句子 "When you come to a fork in the road, take it." 字符串字面量中可以包含转义序列,就像在printf和 scanf的格式串中那样 包含转义序列字符串示例: "Candy\nIs dandy\nBut liquor\nIs quicker.\n --Ogden Nash\n" 实际打印出来效果如下: Candy Is dandy But liquor Is quicker. --Ogden Nash
字符串字面量续行 1当字符串字面量分布在多行,可以用反斜杠来续行: printf("When you come to a fork in the road,take it.\ --Yogi Berra"); 反斜杠八更一般的用途是连接多行程序为一行 ■ 字符串字面量续行更好的办法:将两个字符串放置在 一起,编译器会自动进行拼接形成一个字符串 printf("When you come to a fork in the road,take it. "--Yogi Berra"); 5
5 字符串字面量续行 当字符串字面量分布在多行,可以用反斜杠\来续行: printf("When you come to a fork in the road,take it. \ --Yogi Berra"); 反斜杠\更一般的用途是连接多行程序为一行 字符串字面量续行更好的办法:将两个字符串放置在 一起,编译器会自动进行拼接形成一个字符串 printf("When you come to a fork in the road,take it. " "--Yogi Berra");
字符串字面量在内存中的存储 在c中,长度为n的字符串字面量占据n+1的空 间,多出来的1用于存储字符串结尾的八0' ■结尾的空字符八0'是一个所有bt都是0的字符, 可以直接用整数0代替 ■字符串"abc"在内存中如下: a 0 ■即使是空字符串""也要占据1个字符的空间 \0
6 字符串字面量在内存中的存储 在C中,长度为n的字符串字面量占据n+1的空 间,多出来的1用于存储字符串结尾的'\0' 结尾的空字符'\0'是一个所有bit都是0的字符, 可以直接用整数0代替 字符串"abc"在内存中如下: 即使是空字符串" "也要占据1个字符的空间
字符串字面量的数据类型 由于字符串字面量以数组的形式存储,因此具 有字符指针的数据类型:char* ■ 如下printfi调用将字符串"abc"作为参数传递, 实际上传递的是指向字母a的char*指针: printf("abc"); 可在需要char*指针的地方应用字符串字面量 char *p; p "abc";/now p points to 'a' int *q) q 1;/now q points to address 1
7 字符串字面量的数据类型 由于字符串字面量以数组的形式存储,因此具 有字符指针的数据类型:char * 如下printf调用将字符串"abc"作为参数传递, 实际上传递的是指向字母a的char*指针: printf("abc"); 可在需要char*指针的地方应用字符串字面量 char *p; p = "abc"; // now p points to 'a' int *q; q = 1; // now q points to address 1
字符串字面量的操作 ■字符串字面量支持下标操作: char ch; ch "abc"[1];/now ch ='b' ■转换0到15的数字到16进制字符的函数: char digit_to_hex_char(int digit) { return "0123456789ABCDEF"[digit]; )
8 字符串字面量的操作 字符串字面量支持下标操作: 转换0到15的数字到16进制字符的函数: char ch; ch = "abc"[1]; // now ch == 'b' char digit_to_hex_char(int digit) { return "0123456789ABCDEF"[digit]; }
字符串字面量其它特性 字符串字面量具有常量属性,因此直接或间接 对其进行修改会导致未定义行为: char *p "abc"; *p='d'; *米米 WRONG *** ■包含单一字符的字符串和char类型数据不同 "a"is represented by a pointer a'is represented by an integer printf("\n"); printf('\n'); /**WRONG 米米* 9
9 字符串字面量其它特性 字符串字面量具有常量属性,因此直接或间接 对其进行修改会导致未定义行为: 包含单一字符的字符串和char类型数据不同 "a" is represented by a pointer 'a' is represented by an integer char *p = "abc"; *p = 'd'; /*** WRONG ***/ printf("\n"); printf('\n'); /*** WRONG ***/
字符串变量(String Variables) 任何一维数组都可以用来储存字符串,但字符 串最后必须以null character结尾 ■上述方式的缺陷 必难以判定一个字符数组是否确实是字符串 C标准库字符串函数依赖结尾的空字符,使用时必 须小心 判断字符串长度比较耗时,必须沿字符串序列查找 空字符,复杂度随字符串长度线性增加 10
10 字符串变量(String Variables) 任何一维数组都可以用来储存字符串,但字符 串最后必须以null character结尾 上述方式的缺陷 难以判定一个字符数组是否确实是字符串 C标准库字符串函数依赖结尾的空字符,使用时必 须小心 判断字符串长度比较耗时,必须沿字符串序列查找 空字符,复杂度随字符串长度线性增加