c 语言高级编程 (第四部分) 字符串

66
C 语语语语语语 语语语语语 () 字字字 语语语语 语语语语语语语语

Upload: derex

Post on 07-Jan-2016

181 views

Category:

Documents


5 download

DESCRIPTION

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"); - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: C 语言高级编程 (第四部分) 字符串

C 语言高级编程(第四部分)

字符串

北京大学 信息科学技术学院

Page 2: C 语言高级编程 (第四部分) 字符串

数组 的 存储方式

Page 3: C 语言高级编程 (第四部分) 字符串

内存数组 的 存储方式

数组包含的一组变量在 内存 中 是 连续存放 的

int shuzu[5];

shuzu[0]

shuzu[1]

shuzu[2]

shuzu[3]

shuzu[4]

Page 4: C 语言高级编程 (第四部分) 字符串

关于 数组名称 的说明

Page 5: C 语言高级编程 (第四部分) 字符串

int main(){int shuzu[5];if(shuzu == &(shuzu[0])){

printf("True\n");}else{

printf("False\n");} return 0;

}

内存

shuzu[0]

shuzu[1]

shuzu[2]

shuzu[3]

shuzu[4]

shuzu

Page 6: C 语言高级编程 (第四部分) 字符串

内存

shuzu[0]

shuzu[1]

shuzu[2]

shuzu[3]

shuzu[4]

shuzu

数组名称 是 一个地址

数组名称 是 该数组所占内存空间的起始地址,是数组第一个元素的地址。

Page 7: C 语言高级编程 (第四部分) 字符串

数组名 与 指针变量 静态数组:

数组名是一个指向该数组所占内存空间的地址。 动态数组:

通过指针变量,指向一块自己申请的内存空间,这块空间也是一个数组。 静态数组和动态数组在内存中的本质是一样的,可以用指针

变量来代表数组名:#include <stdio.h>#define N 10int main(){

int i;int distance[N];for( i=0; i<N; i++){

scanf(“%d”, &distance[i]);}return 0;

}

#include <stdio.h>#define N 10int main(){

int i;int distance[N];int *pint;pint = distance;for( i=0; i<N; i++){

scanf(“%d”, &pint[i]);}return 0;

}

Page 8: C 语言高级编程 (第四部分) 字符串

数组元素 的 赋值

声明后 赋值声明时 赋值

Page 9: C 语言高级编程 (第四部分) 字符串

声明后 赋值

int shuzu[5];

内存

shuzu[0]

shuzu[1]

shuzu[2]

shuzu[3]

shuzu[4]

随机值

随机值

随机值

随机值

随机值

Page 10: C 语言高级编程 (第四部分) 字符串

声明后 赋值

int shuzu[5];int i;for(i = 0; i < 5; i++){

shuzu[i] = i;}

内存

shuzu[0]

shuzu[1]

shuzu[2]

shuzu[3]

shuzu[4]

随机值

随机值

随机值

随机值

随机值

Page 11: C 语言高级编程 (第四部分) 字符串

声明后 赋值

int shuzu[5];int i;for(i = 0; i < 5; i++){

shuzu[i] = i;}

内存

shuzu[0]

shuzu[1]

shuzu[2]

shuzu[3]

shuzu[4]

0

1

2

3

4

Page 12: C 语言高级编程 (第四部分) 字符串

声明时 赋值int shuzu[5] = {0, 1, 2, 3, 4};

内存

shuzu[0]

shuzu[1]

shuzu[2]

shuzu[3]

shuzu[4]

0

1

2

3

4

Page 13: C 语言高级编程 (第四部分) 字符串

声明时 赋值int shuzu[5] = {0, 1};

内存

shuzu[0]

shuzu[1]

shuzu[2]

shuzu[3]

shuzu[4]

0

1

0

0

0

当 数值数目 小于 数组变量数目 时, 剩余的数组变量 被赋值为 0

这个规律

对 float, double, char 类型的数组 也适用!

Page 14: C 语言高级编程 (第四部分) 字符串

声明时 赋值int shuzu[5] = {0, 1};

int shuzu[5] = {0, 1, 0, 0, 0};

Page 15: C 语言高级编程 (第四部分) 字符串

字符串

Page 16: C 语言高级编程 (第四部分) 字符串

回顾:字符型变量 的 赋值

Page 17: C 语言高级编程 (第四部分) 字符串

如何 给一个字符型变量赋予一个特定的值?• 基本方法:通过 赋值语句

int main( ) {

char b, c, d;

return 0;

b = ‘x’;

c = b;

d = 120; 可以把字符的 ASCII 编码值赋给一个字符型变量

Page 18: C 语言高级编程 (第四部分) 字符串

ASCII 编码表

字符 x 的编码值是 120

编码值为 0 的字符 是什么字符?

Page 19: C 语言高级编程 (第四部分) 字符串

编码值为 0 的字符 是什么字符?

答:

一个 特殊 的 字符 这个字符的

输出效果是什么

int main(){char a;a = 0;printf("A%cB\n", a);return 0;

}

Page 20: C 语言高级编程 (第四部分) 字符串

编码值为 0 的字符

int main(){ char a; a = 0; …… return 0;

}

int main(){ char a; a = ‘\0’; …… return 0;

}

Page 21: C 语言高级编程 (第四部分) 字符串

什么是 字符串

Page 22: C 语言高级编程 (第四部分) 字符串

什么是 字符串

you are a student!

字符串 是 由 一个或多个 字符 构成 的 序列

Page 23: C 语言高级编程 (第四部分) 字符串

在 C 语言中, 字符串 是 如何 实现 / 存储 的

在 C 语言中, 字符串 被实现为 一维字符数组

在 C 语言中, 字符串 被存储在 一维字符数组 中

Page 24: C 语言高级编程 (第四部分) 字符串

在 C 语言中, 字符串 是 如何 实现 / 存储 的

在 C 语言中, 字符串 以 字符‘ \0’ 作为结尾

Page 25: C 语言高级编程 (第四部分) 字符串

如何声明 一个 字符串常量

“you are a student!”

用 双引号 把 需要表达的字符串 括起来

编译器 负责在 末尾 添加 一个‘ \0’ 字符

Page 26: C 语言高级编程 (第四部分) 字符串

如何声明 一个 字符串变量第一步: 确定 想要存储的字符串 的 最大长度 LEN

第二步: 声明一个 长度为 LEN+1 的 一维字符数组

WHY字符串 以 字符‘ \0’ 作为结尾 ; 需要为 该字符 预留一个存储空间

Page 27: C 语言高级编程 (第四部分) 字符串

字符串变量 一维字符数组

Page 28: C 语言高级编程 (第四部分) 字符串

向控制台

输出 字符串 常量

Page 29: C 语言高级编程 (第四部分) 字符串

向控制台 输出 字符串常量

方法 1 : printf 函数

int main(){ printf(“u r a student”); return 0;

}

字符串常量

Page 30: C 语言高级编程 (第四部分) 字符串

int main(){ printf(“you are a stud\0ent”); printf(“\n”); return 0;

}

这个程序 的 输出效果 是什么?

Page 31: C 语言高级编程 (第四部分) 字符串

int main(){printf(“u r a student\n”);return 0;

}

向控制台 输出 字符串常量

方法 2 : puts 函数

int main(){puts(“u r a student”);return 0;

}

Page 32: C 语言高级编程 (第四部分) 字符串

字符串 的 长度 字符串 中 第一个‘ \0’ 字符 之前 的 字符 的 个数“you are a student!” 长度为 18

“you are a stud\0ent!” 长度为 14

Page 33: C 语言高级编程 (第四部分) 字符串

向控制台

输出 字符串 变量

Page 34: C 语言高级编程 (第四部分) 字符串

向控制台 输出 字符串变量方法 1 : printf 函数 + %s 修饰符

int main(){ char zfc[50]; … … // 给字符串变量 zfc 赋值 printf(“%s”, zfc); return 0;

}

Page 35: C 语言高级编程 (第四部分) 字符串

向控制台 输出 字符串变量方法 2 : puts 函数 int main(){

char zfc[50];… … // 赋值puts(zfc);return 0;

}

int main(){char zfc[50];… … // 赋值printf(“%s\n”, zfc);return 0;

}

Page 36: C 语言高级编程 (第四部分) 字符串

字符串变量 的 赋值声明时 赋值声明后 赋值

Page 37: C 语言高级编程 (第四部分) 字符串

声明时赋值 之 烦琐方式char zfc[LEN] = {‘u’, ‘ ’, ‘r’, ‘ ’, ‘a’, ‘ ’, ‘s’, ‘t’, ‘u’, ‘d’, ‘e’, ‘n’, ‘t’, ‘\0’};

LEN 必须大于 13

u r a s t u d e n t \0 … \00 1 2 3 4 5 6 7 8 9 10 11 12 13 … LEN-1

请不要使用这种方式!

Page 38: C 语言高级编程 (第四部分) 字符串

声明时赋值 之 简洁方式char zfc[LEN] = {‘u’, ‘ ’, ‘r’, ‘ ’, ‘a’, ‘ ’, ‘s’, ‘t’, ‘u’, ‘d’, ‘e’, ‘n’, ‘t’, ‘\0’};

u r a s t u d e n t \0 … \00 1 2 3 4 5 6 7 8 9 10 11 12 13 … LEN-1

char zfc[LEN] = “u r a student”;char zfc[LEN];zfc = “u r a student”;

Page 39: C 语言高级编程 (第四部分) 字符串

声明后赋值 之 从控制台输入方法 1 :

scanf 函数 + %s 修饰符 int main(){

char zfc[50]; scanf(“%s”, zfc); printf(“%s\n”, zfc); return 0;

}

缺点: 不能接收 包含空格的字符串

Page 40: C 语言高级编程 (第四部分) 字符串

声明后赋值 之 从控制台输入方法 2 : gets 函数

int main(){ char zfc[50]; gets(zfc); printf(“%s\n”, zfc); return 0;

}

Page 41: C 语言高级编程 (第四部分) 字符串

声明后赋值 之 从控制台输入方法 1 :

scanf 函数 + %s 修饰符

方法 2 : gets 函数

请 尽量使用 方法 1除非 字符串中 含有空格

Page 42: C 语言高级编程 (第四部分) 字符串

声明后赋值 之 从另一个字符串赋值

方法:“字符串复制”函数 strcpy( 目标字符串 , 源字符串 ) ;

注意:调用时,要确保 目标字符串所在数组的长度

大于 源字符串的长度

功能:把 源字符串 赋值给 目标字符串

# include <string.h>

Page 43: C 语言高级编程 (第四部分) 字符串

声明后赋值 之 从另一个字符串赋值

int main(){ char zfc_src[50], zfc_tgt[50]; gets(zfc_src); strcpy(zfc_tgt, zfc_src); printf(“%s\n”, zfc_tgt); return 0;

}

Page 44: C 语言高级编程 (第四部分) 字符串

声明时赋值 之 指针方式

char *zfc = “u r a student”;

Page 45: C 语言高级编程 (第四部分) 字符串

字符串 数组

由 字符串变量 构成 的 数组

Page 46: C 语言高级编程 (第四部分) 字符串

字符串 数组

字符串变量 一维字符数组

字符串数组 二维字符数组

Page 47: C 语言高级编程 (第四部分) 字符串

如何声明 字符串 数组第一步: 确定 数组中存储的字符串 的 最大长度 LEN

第二步: 确定 数组包含的字符串变量 的 最大数量 N

第三步: 声明 一个

行数为 N ,列数为 LEN+1 的 二维字符数组

char zfcsz[N][LEN+1];

Page 48: C 语言高级编程 (第四部分) 字符串

如何使用 字符串 数组 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;

}

Page 49: C 语言高级编程 (第四部分) 字符串

关于 字符串 的 常用函数1. strcpy( 目标字符串,源字符串 )2. strlen( 字符串 )3. strcmp( 字符串 A ,源字符串 B)4. strcat( 目标字符串,源字符串 )5. strlwr( 字符串 )6. strupr( 字符串 )

使用这些函数前,需要# include <string.h>

Page 50: C 语言高级编程 (第四部分) 字符串

“ 字符串复制”函数 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;

}

Page 51: C 语言高级编程 (第四部分) 字符串

“ 获得字符串长度”函数 int strlen( 字符串 ) ;

int main(){char zfc[100];gets(zfc);printf(“%d\n”, strlen(zfc));return 0;

}

Page 52: C 语言高级编程 (第四部分) 字符串

“ 字符串比较”函数 int strcmp( 字符串 A, 字符串 B) ;

功能: 比较 两个字符串 的 大小

Page 53: C 语言高级编程 (第四部分) 字符串

“ 字符串比较”函数 int strcmp( 字符串 A, 字符串 B) ;

当 字符串 A 和 字符串 B 相等时, 该函数 返回 0

对于 字符串 A 和 字符串 B, 当且仅当 两者的长度相等,且 结尾字符‘ \0’ 前的对应字符均相等 时称:这两个字符串相等,

Page 54: C 语言高级编程 (第四部分) 字符串

“ 字符串比较”函数 int strcmp( 字符串 A, 字符串 B) ;

int result = strcmp(“Hello!”, “Hello!”);

int result = strcmp(“Hello!”, “hello!”);

int result = strcmp(“Hel\0lo!”, “Hel\0lo”);

result == 0

result != 0

result == 0

Page 55: C 语言高级编程 (第四部分) 字符串

“ 字符串比较”函数 int strcmp( 字符串 A, 字符串 B) ;

当 字符串 A 和 字符串 B 不相等时, 该函数 返回: 两个字符串中第一对不相等的字符

对应的 ACSII 码值的差

int result = strcmp(“helloH”, “helloh”);

result == -32

Page 56: C 语言高级编程 (第四部分) 字符串

字符 h 的编码值是 104

字符 H 的编码值是 72

72 – 104 == -32

Page 57: C 语言高级编程 (第四部分) 字符串

“ 字符串比较”函数 int strcmp( 字符串 A, 字符串 B) ;

当 字符串 A 和 字符串 B 不相等时, 该函数 返回: 两个字符串中第一对不相等的字符

对应的 ACSII 码值的差

int result = strcmp(“helloh”, “HelloH”);

result == 32

Page 58: C 语言高级编程 (第四部分) 字符串

字符串比较:对两个字符串从前往后逐个字符相比较(按 ASCII码值大小比较),直到出现不同的字符或遇到 '\0' 为止。如果全部字符都相同,则认为相同;如果出现不相同的字符,则以第一个不相同的字符的比较结果为准。例如:

"A"<"B" , "12"<“123" , "123"<"2", "there">"that" strcmp 函数返回一个整数,其意义:

如果函数返回值为 0 ,则字符串 1 和 字符串 2 的内容相同如果函数返回一个正整数,则字符串 1 > 字符串 2

如果函数返回一个负整数,则字符串 1 < 字符串 2

strcmp("A", "B") < 0

strcmp("there", "that") > 0

strcmp("abc", "abc") == 0

不能用 == 比较字符串内容:str1==str2

"abc"=="abc" 的值为 ?

“ 字符串比较”函数 int strcmp( 字符串 A, 字符串 B) ;

Page 59: C 语言高级编程 (第四部分) 字符串

“ 字符串连接”函数 strcat( 目标字符串 , 源字符串 ) ;

注意:调用时,要确保 目标字符串所在数组的长度

大于

源字符串的长度 +目标字符串的长度

功能:把 源字符串 添加到 目标字符串 的结尾

Page 60: C 语言高级编程 (第四部分) 字符串

“ 字符串连接”函数 strcat( 目标字符串 , 源字符串 ) ;

int main(){char zfc_src[50], zfc_tgt[100];gets(zfc_tgt);gets(zfc_src);strcat(zfc_tgt, zfc_src);printf("%s\n", zfc_tgt);

return 0;}

Page 61: C 语言高级编程 (第四部分) 字符串

“ 大写字母变小写”函数 strlwr( 字符串 ) ;

“ 小写字母变大写”函数 strupr( 字符串 ) ;

Page 62: C 语言高级编程 (第四部分) 字符串

int main(){char zfc[100];gets(zfc);strlwr(zfc);printf("%s\n", zfc);strupr(zfc);printf("%s\n", zfc);return 0;

}

注意:这两个函数在编程网格中不支持!

Page 63: C 语言高级编程 (第四部分) 字符串

另一个常用的字符串函数:sprintf( 字符数组 , 格式控制 , 变量列表 )

与 printf() 函数的作用相似,但是将输出结果送到字符数组中,形成字符串。

#include <string.h>void main(){ char s1[50]; int a=20; double b=3.1416; sprintf(s1,”An int %d and a double %f.”, a, b); printf("%s", s1);}

(注意字符数组 S1的长度)

S1的值为: An int 20 and a double 3.141600.

Page 64: C 语言高级编程 (第四部分) 字符串

字符串应用的例子 求字符串中大写字母的个数(使用 strlen() )

#include <stdio.h>#include <string.h>void main() { char str[256]; int count = 0, len; scanf("%s", str); len = strlen(str); for ( int i = 0; i<len; i++ ) { if ( str[i] >= 'A' && str[i] <= 'Z' ) count++; } printf("%s has %d uppercases\n", str, count);}

Page 65: C 语言高级编程 (第四部分) 字符串

问题:如何将一个字符串中的大写字母变为小写字母,而小写字母则变为大写字母?

#include <stdio.h>#include <string.h>void main() { char str[256]; int count = 0, len; scanf("%s", str); len = strlen(str); for ( int i = 0; i<len; i++ ) { if ( str[i] >= 'A' && str[i] <= 'Z' ) str[i] = str[i] – ‘A’ + ‘a’; else if ( str[i] >= ‘a' && str[i] <= ‘z' ) str[i] = str[i] – ‘a’ + ‘A’; } printf("%s\n", str);}

如果把“ else” 去掉,结果会怎样?

注意:可以仿照这个方法,自己实现 strlwr() 和 strupr()

Page 66: C 语言高级编程 (第四部分) 字符串

课堂作业

请同学们拿出笔和纸,1. 写下 姓名和学号;2. 写下 满足上述要求的程序;