680 likes | 902 Views
C 语言高级编程 (第四部分) 字符串. 北京大学 信息科学技术学院. 数组 的 存储方式. 内存. 数组 的 存储方式. shuzu [ 0 ]. 数组 包含的 一组变量 在 内存 中 是 连续存放 的. shuzu [ 1 ]. shuzu [ 2 ]. shuzu [ 3 ]. int shuzu [ 5 ];. shuzu [ 4 ]. 关于 数组名称 的说明. 内存. int main(){ int shuzu [5]; if( shuzu == &( shuzu [ 0 ] ) ){ printf(" True <br>");
E N D
C语言高级编程(第四部分)字符串 北京大学信息科学技术学院
内存 数组的存储方式 shuzu[0] 数组包含的一组变量 在内存中是连续存放的 shuzu[1] shuzu[2] shuzu[3] int shuzu[5]; shuzu[4]
内存 • int main(){ • int shuzu[5]; • if(shuzu==&(shuzu[0])){ • printf("True\n"); • }else{ • printf("False\n"); • } • return 0; • } shuzu shuzu[0] shuzu[1] shuzu[2] shuzu[3] shuzu[4]
内存 shuzu shuzu[0] 数组名称是一个地址 shuzu[1] shuzu[2] 数组名称是 该数组所占内存空间的起始地 址,是数组第一个元素的地址。 shuzu[3] shuzu[4]
数组名与 指针变量 • 静态数组: • 数组名是一个指向该数组所占内存空间的地址。 • 动态数组: • 通过指针变量,指向一块自己申请的内存空间,这块空间也是一个数组。 • 静态数组和动态数组在内存中的本质是一样的,可以用指针变量来代表数组名: #include <stdio.h> #define N10 int main(){ inti; int distance[N]; for( i=0; i<N; i++){ scanf(“%d”, &distance[i]); } return 0; } #include <stdio.h> #define N10 int main(){ inti; int distance[N]; int *pint; pint = distance; for( i=0; i<N; i++){ scanf(“%d”, &pint[i]); } return 0; }
数组元素的赋值 声明后赋值 声明时赋值
内存 声明后赋值 shuzu[0] 随机值 int shuzu[5]; shuzu[1] 随机值 shuzu[2] 随机值 shuzu[3] 随机值 shuzu[4] 随机值
内存 声明后赋值 shuzu[0] 随机值 int shuzu[5]; shuzu[1] 随机值 int i; for(i = 0; i < 5; i++){ shuzu[i] = i; } shuzu[2] 随机值 shuzu[3] 随机值 shuzu[4] 随机值
内存 声明后赋值 shuzu[0] 0 int shuzu[5]; shuzu[1] 1 int i; for(i = 0; i < 5; i++){ shuzu[i] = i; } shuzu[2] 2 shuzu[3] 3 shuzu[4] 4
内存 声明时赋值 shuzu[0] 0 • int shuzu[5] = {0, 1, 2, 3, 4}; shuzu[1] 1 shuzu[2] 2 shuzu[3] 3 shuzu[4] 4
内存 声明时赋值 shuzu[0] 0 • int shuzu[5] = {0, 1}; shuzu[1] 1 当 数值数目小于数组变量数目时, 剩余的数组变量被赋值为0 shuzu[2] 0 shuzu[3] 0 shuzu[4] 这个规律 对float, double, char 类型的数组 也适用! 0
声明时赋值 • int shuzu[5] = {0, 1}; • int shuzu[5] = {0, 1,0,0,0};
如何给一个字符型变量赋予一个特定的值? • 基本方法:通过赋值语句 int main(){ char b, c, d; return0; } b = ‘x’; c = b; 可以把字符的ASCII编码值 赋给一个字符型变量 d = 120;
ASCII 编码表 编码值为0的字符 是什么字符? 字符x的编码值是120
这个字符的 输出效果是什么 答: 一个特殊的字符 • int main(){ • char a; • a = 0; • printf("A%cB\n", a); • return 0; • } 编码值为0的字符 是什么字符?
编码值为0的字符 • int main(){ • char a; • a = 0; • …… • return 0; • } • int main(){ • char a; • a = ‘\0’; • …… • return 0; • }
什么是字符串 • 字符串是 • 由一个或多个字符构成的序列 you are a student!
在C语言中,字符串是如何实现/存储的 在C语言中, 字符串被实现为一维字符数组 在C语言中, 字符串被存储在一维字符数组中
在C语言中,字符串是如何实现/存储的 在C语言中, 字符串以字符‘\0’作为结尾
如何声明一个字符串常量 用双引号把需要表达的字符串括起来 “you are a student!” 编译器负责 在末尾添加一个‘\0’字符
如何声明一个字符串变量 第一步: 确定想要存储的字符串的最大长度LEN 第二步: 声明一个长度为LEN+1 的一维字符数组 字符串以字符‘\0’作为结尾; 需要为该字符预留一个存储空间 WHY
字符串变量 一维字符数组
向控制台输出字符串常量 方法1: printf 函数 字符串常量 • int main(){ • printf(“u r a student”); • return 0; • }
int main(){ • printf(“you are a stud\0ent”); • printf(“\n”); • return 0; • } 这个程序的输出效果是什么?
向控制台输出字符串常量 方法2: puts 函数 • int main(){ • puts(“u r a student”); • return 0; • } • int main(){ • printf(“u r a student\n”); • return 0; • }
字符串的长度 字符串中第一个‘\0’字符之前 的字符的个数 长度为18 “you are a student!” 长度为14 “you are a stud\0ent!”
向控制台输出字符串变量 方法1: printf 函数+%s修饰符 • int main(){ • char zfc[50]; • … … //给字符串变量zfc赋值 • printf(“%s”, zfc); • return 0; • }
向控制台输出字符串变量 方法2: puts 函数 • int main(){ • char zfc[50]; • … … //赋值 • puts(zfc); • return 0; • } • int main(){ • char zfc[50]; • … … //赋值 • printf(“%s\n”, zfc); • return 0; • }
字符串变量的赋值 声明时赋值 声明后赋值
声明时赋值之烦琐方式 • char zfc[LEN] = • {‘u’, ‘ ’, ‘r’, ‘ ’, ‘a’, ‘ ’, ‘s’, ‘t’, ‘u’, ‘d’, ‘e’, ‘n’, ‘t’, ‘\0’}; LEN必须大于13 请不要使用这种方式! … 0 1 2 3 4 5 6 7 8 9 10 11 12 13 LEN-1 … u r a s t u d e n t \0 \0
声明时赋值之简洁方式 • char zfc[LEN] = • {‘u’, ‘ ’, ‘r’, ‘ ’, ‘a’, ‘ ’, ‘s’, ‘t’, ‘u’, ‘d’, ‘e’, ‘n’, ‘t’, ‘\0’}; • char zfc[LEN] = “u r a student”; • char zfc[LEN]; • zfc = “u r a student”; … 0 1 2 3 4 5 6 7 8 9 10 11 12 13 LEN-1 … u r a s t u d e n t \0 \0
声明后赋值之从控制台输入 • 方法1: • scanf函数 + %s修饰符 • int main(){ • char zfc[50]; • scanf(“%s”, zfc); • printf(“%s\n”, zfc); • return 0; • } 缺点: 不能接收 包含空格的字符串
声明后赋值之从控制台输入 • 方法2:gets函数 • int main(){ • char zfc[50]; • gets(zfc); • printf(“%s\n”, zfc); • return 0; • }
声明后赋值之从控制台输入 • 方法1: • scanf函数 + %s修饰符 • 方法2:gets函数 请尽量使用方法1 除非字符串中含有空格
声明后赋值之从另一个字符串赋值 • 方法:“字符串复制”函数 • strcpy(目标字符串, 源字符串); 功能:把源字符串赋值给目标字符串 #include <string.h> 注意:调用时,要确保 目标字符串所在数组的长度 大于源字符串的长度
声明后赋值之从另一个字符串赋值 • int main(){ • char zfc_src[50], zfc_tgt[50]; • gets(zfc_src); • strcpy(zfc_tgt, zfc_src); • printf(“%s\n”, zfc_tgt); • return 0; • }
声明时赋值之指针方式 • char *zfc = “u r a student”;
字符串数组 由字符串变量构成的数组
字符串数组 字符串变量 一维字符数组 字符串数组 二维字符数组
如何声明字符串数组 第一步: 确定数组中存储的字符串的最大长度LEN 第二步: 确定数组包含的字符串变量的最大数量N 第三步: 声明一个 行数为N,列数为LEN+1 的二维字符数组 char zfcsz[N][LEN+1];
如何使用字符串数组 • int main(){ • char zfc_src[50], zfc_tgt[50]; • gets(zfc_src); • strcpy(zfc_tgt, zfc_src); • printf(“%s\n”, zfc_tgt); • return 0; • } • int main(){ • char zfc[2][50]; • gets(zfc[0]); • strcpy(zfc[1], zfc[0]); • printf(“%s\n”, zfc[1]); • return 0; • }
关于字符串的常用函数 strcpy(目标字符串,源字符串) strlen(字符串) strcmp(字符串A,源字符串B) strcat(目标字符串,源字符串) strlwr(字符串) strupr(字符串) 使用这些函数前,需要#include <string.h>
“字符串复制”函数 • strcpy(目标字符串, 源字符串); 功能:把源字符串赋值给目标字符串 • int main(){ • char zfc_src[50], zfc_tgt[50]; • gets(zfc_src); • strcpy(zfc_tgt, zfc_src); • printf(“%s\n”, zfc_tgt); • return 0; • }