模块一 程序设计基础 (五)字符串处理部分

37
模模 模模模模模模 模模 模模模模模模 模模 模模模模模模模 () 模模 模模模模模模模 () 模模模模 模模模模

Upload: admon

Post on 12-Jan-2016

194 views

Category:

Documents


4 download

DESCRIPTION

模块一 程序设计基础 (五)字符串处理部分. 基础模块. 模块一 字符串处理学习内容.  字符串常量  字符串处理函数  字符数组和字符指针  向函数传递字符串  从函数返回一个字符串指针. 1.1 字符串常量. H o w a r e y o u \0. 一串以 '\0' 结尾的字符在 C 语言中被看作字符串. "How are you". 用双引号括起的一串字符是字符串常量, C 语言自动为其添加 '\0' 结束符. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 模块一 程序设计基础 (五)字符串处理部分

模块一 程序设计基础模块一 程序设计基础(五)字符串处理部分(五)字符串处理部分模块一 程序设计基础模块一 程序设计基础(五)字符串处理部分(五)字符串处理部分

基础模块基础模块基础模块基础模块

Page 2: 模块一 程序设计基础 (五)字符串处理部分

模块一 字符串处理学习内容模块一 字符串处理学习内容

字符串常量 字符串常量 字符串处理函数字符串处理函数 字符数组和字符指针字符数组和字符指针 向函数传递字符串向函数传递字符串 从函数返回一个字符串指针 从函数返回一个字符串指针

Page 3: 模块一 程序设计基础 (五)字符串处理部分

1.11.1 字符串常量字符串常量

用双引号括起的一串字符是字符串常量, C 语言自动为其添加 '\0'结束符

"How are you""How are you"

H o w a r e y o u \0H o w a r e y o u \0

一串以 '\0'结尾的字符在 C 语言中被看作字符串

Page 4: 模块一 程序设计基础 (五)字符串处理部分

1.21.2 字符串的存储字符串的存储 CC 语言并没有为字符串提供任何专门的表示法,语言并没有为字符串提供任何专门的表示法,

完全使用字符数组和字符指针来处理完全使用字符数组和字符指针来处理 字符数组字符数组

每个元素都是字符类型的数组每个元素都是字符类型的数组charchar str[80]; str[80];

H o w a r e y o u H o w a r e y o u \0\0

H o w a r e y o u \0H o w a r e y o u \0

是字符数组,但不代表字符串

数组的最后一个元素必须是 '\0'

Page 5: 模块一 程序设计基础 (五)字符串处理部分

字符数组的初始化字符数组的初始化用字符型数据对数组进行初始化用字符型数据对数组进行初始化

charchar str[6] = str[6] =

{'C','h','i','n','a','\0'}; {'C','h','i','n','a','\0'};

用字符串常量直接对数组初始化用字符串常量直接对数组初始化 charchar str[6] = {"China"}; str[6] = {"China"};

charchar str[6] = "China"; str[6] = "China";

Page 6: 模块一 程序设计基础 (五)字符串处理部分

1.31.3 字符指针字符指针 CC 语言并没有为字符串提供任何专门的表示语言并没有为字符串提供任何专门的表示

法,完全使用字符数组和字符指针来处理法,完全使用字符数组和字符指针来处理字符串是一串用双引号引起来的字符

H e l l o C h i n a \0 H e l l o C h i n a \0

字符数组就是每个元素都是字符型的数组

字符指针就是指向字符类型数据的指针

"Hello China"

pStr

数组最后一个元素必须是 '\0' 才表示字符串

Page 7: 模块一 程序设计基础 (五)字符串处理部分

1.31.3 字符指针字符指针

定义和初始化方法不同定义和初始化方法不同

strstr = "Hello China";

H e l l o C h i n a \0 H e l l o C h i n a \0

"Hello China"

pStrpStr

char str[12] = {"Hello China"};

char *pStr;pStrpStr = "Hello China";

strstr

数组名 strstr是地址常量

字符指针 pStrpStr是变量

Page 8: 模块一 程序设计基础 (五)字符串处理部分

1.31.3 字符指针字符指针

定义和初始化方法不同定义和初始化方法不同

char *pStr = "Hello China";

H e l l o C h i n a \0 H e l l o C h i n a \0

"Hello China"

pStrpStr

char str[12] = {"Hello China"};

char *pStr;pStr = "Hello China";

str

pStr = &str[0];

Page 9: 模块一 程序设计基础 (五)字符串处理部分

按字符逐个输入按字符逐个输入 // 输出输出

forfor (i=0; str[i]!='\0'; i++) (i=0; str[i]!='\0'; i++){{ putchar(str[i]);putchar(str[i]);

}}putchar('\n');putchar('\n');

charchar str[10];str[10];

1.41.4 字符串的访问和输入字符串的访问和输入 // 输出输出1.41.4 字符串的访问和输入字符串的访问和输入 // 输出输出

一般不用字符串长度控制

Page 10: 模块一 程序设计基础 (五)字符串处理部分

按字符串整体输入按字符串整体输入 // 输出输出按字符串整体输入按字符串整体输入 // 输出输出

scanf("%s",str); printf("%s",str);

charchar str[10]; str[10];

1.41.4 字符串的访问和输入字符串的访问和输入 // 输出输出1.41.4 字符串的访问和输入字符串的访问和输入 // 输出输出

gets(str); puts(str);

不能输入带空格的字符串

可以输入带空格的字符串

Page 11: 模块一 程序设计基础 (五)字符串处理部分

scanf("%s",str); printf("%s",str);

charchar str[10]; str[10];

1.41.4 字符串的访问和输入字符串的访问和输入 // 输出输出1.41.4 字符串的访问和输入字符串的访问和输入 // 输出输出

gets(str); puts(str);

空格、回车或制表( Tab)符是输入数据的分隔符,因而不能被读入,输入遇到这些字符时,系统认为字符串输入结束

按字符串整体输入按字符串整体输入 // 输出输出按字符串整体输入按字符串整体输入 // 输出输出

Page 12: 模块一 程序设计基础 (五)字符串处理部分

1.41.4 字符串的访问和输入字符串的访问和输入 // 输出输出【【例例 1.11.1 】】从键盘输入一个人名,把它显示在屏幕上 从键盘输入一个人名,把它显示在屏幕上

Page 13: 模块一 程序设计基础 (五)字符串处理部分

1.41.4 字符串的访问和输入字符串的访问和输入 // 输出输出【【例例 1.11.1 】】从键盘输入一个人名,把它显示在屏幕上 从键盘输入一个人名,把它显示在屏幕上

Page 14: 模块一 程序设计基础 (五)字符串处理部分

1.41.4 字符串的访问和输入字符串的访问和输入 // 输出输出【【例例 1.21.2 】】使用函数使用函数 gets()gets() ,从键盘输入一个,从键盘输入一个

带有空格的人名,然后把它显示在屏幕上 带有空格的人名,然后把它显示在屏幕上

Page 15: 模块一 程序设计基础 (五)字符串处理部分

1.41.4 字符串的访问和输入字符串的访问和输入 // 输出输出【【例例 1.21.2 】】使用函数使用函数 gets()gets() ,从键盘输入一个,从键盘输入一个

带有空格的人名,然后把它显示在屏幕上 带有空格的人名,然后把它显示在屏幕上 不限制输入字符串的长度

易引起缓冲区溢出,给黑客攻击以可乘之机

Page 16: 模块一 程序设计基础 (五)字符串处理部分

1.41.4 字符串的访问和输入字符串的访问和输入 // 输出输出【【例例 1.21.2 】】使用函数使用函数 gets()gets() ,从键盘输入一个,从键盘输入一个

带有空格的人名,然后把它显示在屏幕上 带有空格的人名,然后把它显示在屏幕上 能够限制输入字符串的长度

Page 17: 模块一 程序设计基础 (五)字符串处理部分

1.41.4 字符串的访问和输入字符串的访问和输入 // 输出输出【【例例 1.31.3 】】从键盘输入一个带有空格的人名,从键盘输入一个带有空格的人名,

然后在显示人名的前面显示然后在显示人名的前面显示 "Hello", I said "Hello", I said to to

Page 18: 模块一 程序设计基础 (五)字符串处理部分

1.41.4 字符串的访问和输入字符串的访问和输入 // 输出输出【【例例 1.31.3 】】从键盘输入一个带有空格的人名,从键盘输入一个带有空格的人名,

然后在显示人名的前面显示然后在显示人名的前面显示 "Hello", I said "Hello", I said to to

Page 19: 模块一 程序设计基础 (五)字符串处理部分

1.51.5 字符串处理函数字符串处理函数 #include <string.h>#include <string.h>

strcpy( 目的字符串 , 源字符串 ); string copy

strlen( 字符串 ); string length

strcat( 目的字符串 , 源字符串 ); string combination

strcmp( 字符串 1, 字符串 2);string

comparison

Page 20: 模块一 程序设计基础 (五)字符串处理部分

计算字符串长度计算字符串长度 #include <string.h>#include <string.h>

strlen( 字符串 ); string length

char str[10] = {"China"};char str[10] = {"China"};printf("%d",printf("%d", strlen(str));strlen(str));

打印结果是 5 , 6 ,还是 10?

C h i n a \0 \0 \0 \0 \0C h i n a \0 \0 \0 \0 \0

不包括 \0的实际字符的个数

Page 21: 模块一 程序设计基础 (五)字符串处理部分

计算字符串长度计算字符串长度 #include <string.h>#include <string.h>

strlen( 字符串 ); string length

len =len = strlen(str);strlen(str);forfor (i=0; i<len; i++) (i=0; i<len; i++){{

putchar(str[i]);putchar(str[i]);}}putchar('\n');putchar('\n');

用长度控制字符串输出

Page 22: 模块一 程序设计基础 (五)字符串处理部分

字符串复制字符串复制 #include <string.h>#include <string.h>

strcpy( 目的字符串 , 源字符串 ); string copy

字符串能否用 = 整体复制?str2 = str1;

strcpy(str2, str1);

注意复制的方向!

str2必须足够大!

Page 23: 模块一 程序设计基础 (五)字符串处理部分

字符串复制字符串复制 #include <string.h>#include <string.h>

strcpy( 目的字符串 , 源字符串 ); string copy

字符串能否用 = 整体复制?str2 = str1;

strcpy(str2, str1);

想想这个函数是如何实现字符串复制的?

Page 24: 模块一 程序设计基础 (五)字符串处理部分

字符串连接字符串连接 #include <string.h>#include <string.h>

strcat( 目的字符串 , 源字符串 ); string combination

strcat(str2, str1);

str2必须足够大!

H e l l o H e l l o \0 \0 \0 \0 \0 \0\0 \0 \0 \0 \0 \0 \0 \0

C h i n a \0C h i n a \0

H e l l o H e l l o C h i n a \0C h i n a \0 \0 \0

Page 25: 模块一 程序设计基础 (五)字符串处理部分

字符串比较字符串比较 #include <string.h>#include <string.h>

strcmp( 字符串 1, 字符串 2);string

comparison

字符串能否用 >,<,==比较大小?if (str2 == str1)

if (strcmp(str2, str1) == 0)

Page 26: 模块一 程序设计基础 (五)字符串处理部分

字符串比较字符串比较 #include <string.h>#include <string.h>

strcmp( 字符串 1, 字符串 2);string

comparison

字符串是如何比较大小的?

当出现第一对不相等的字符时,就由这两个字符决定所在字符串的大小,返回其 ASCII码比较的结果值

comparecomputer

compare < computer 表示strcmp(str1, str2) < 0为

Page 27: 模块一 程序设计基础 (五)字符串处理部分

【【例例 1.41.4 】】按奥按奥运会参赛国国名运会参赛国国名在字典中的顺序在字典中的顺序对其入场次序进对其入场次序进行排序行排序

Page 28: 模块一 程序设计基础 (五)字符串处理部分

【【例例 1.41.4 】】按奥运会参赛国国名在字典中的顺序按奥运会参赛国国名在字典中的顺序对其入场次序进行排序对其入场次序进行排序

Page 29: 模块一 程序设计基础 (五)字符串处理部分

1.51.5 字符串处理函数字符串处理函数

Page 30: 模块一 程序设计基础 (五)字符串处理部分

1.61.6 向函数传递字符串向函数传递字符串向函数传递字符串时,既可使用字符数向函数传递字符串时,既可使用字符数

组作函数参数,也可使用字符指针作函组作函数参数,也可使用字符指针作函数参数 数参数

传地址调用传地址调用

Page 31: 模块一 程序设计基础 (五)字符串处理部分

例例 1.5 1.5 :字符串复制:字符串复制——用字符数组编程用字符数组编程voidvoid MyStrcpy( MyStrcpy(charchar dstStr[], dstStr[], charchar srcStr[]) srcStr[]){{

intint i = 0; i = 0; whilewhile (srcStr[i] != '\0') (srcStr[i] != '\0'){ {

dstStr[i] = srcStr[i]; dstStr[i] = srcStr[i]; i++; i++; }}

dstStr[i] = '\0';dstStr[i] = '\0';}}

H e l l o C h i n a H e l l o C h i n a \0\0

srcStr[i]srcStr[i]

dstStr[i]dstStr[i] HH

i=0i=0

ee

i=1i=1

ll

i=2i=2

ll

i=3i=3

oo

i=4i=4 i=5i=5

CC

i=6i=6

hh

i=7i=7

ii

i=8i=8

nn

i=9i=9

aa

i=10i=10

\0\0

srcStr[i]=='\0srcStr[i]=='\0

Page 32: 模块一 程序设计基础 (五)字符串处理部分

voidvoid MyStrcpy( MyStrcpy(charchar *dstStr, *dstStr, charchar *srcStr) *srcStr){{

whilewhile (*srcStr != '\0') (*srcStr != '\0'){ {

*dstStr = *srcStr; *dstStr = *srcStr; srcStr++; srcStr++;

dstStr++; dstStr++; }}*dstStr = '\0'; *dstStr = '\0';

}}

例例 1.5 1.5 :字符串复制:字符串复制——用字符指针编程用字符指针编程

H e l l o C h i n a H e l l o C h i n a \0\0

*srcStr*srcStr

*dstStr*dstStr HH ee ll ll oo CC hh ii nn aa \0\0

*srcStr=='\0*srcStr=='\0srcStr++

srcStr

dstStr++

dstStr

srcStr

dstStr

srcStr

dstStr

srcStr

dstStr

srcStr

dstStr

srcStr

dstStr

srcStr

dstStr

srcStr

dstStr

srcStr

dstStr

srcStr

dstStr

srcStr

dstStr

srcStr

dstStr

Page 33: 模块一 程序设计基础 (五)字符串处理部分

例例 1.6 1.6 :计算实际字符个数 :计算实际字符个数 unsigned intunsigned int MyStrlen( MyStrlen(charchar str[]) str[]){ {

intint i; i;unsigned intunsigned int len = 0; len = 0; forfor (i=0; str[i]!='\0'; i++) (i=0; str[i]!='\0'; i++) {{

len++; len++; }}returnreturn (len); (len);

} } unsigned int MyStrlen(unsigned int MyStrlen(const char const char *pStr)*pStr){ {

unsigned intunsigned int len = 0; len = 0; forfor (; *pStr!='\0'; pStr++) (; *pStr!='\0'; pStr++) {{

len++; len++; }}returnreturn (len); (len);

} }

方法方法 22 :用字符指针实现:用字符指针实现

方法方法 11 :用字符数组实现:用字符数组实现

统计实际字符个数(不含 '\0' )

Page 34: 模块一 程序设计基础 (五)字符串处理部分

1.71.7 从函数返回字符指针从函数返回字符指针【【例例 1.71.7 】】编程实现编程实现 strcat()strcat() 的功能 的功能

Page 35: 模块一 程序设计基础 (五)字符串处理部分

1.71.7 从函数返回字符指针从函数返回字符指针【【例例 1.71.7 】】编程实现编程实现 strcat()strcat() 的功能 的功能

Page 36: 模块一 程序设计基础 (五)字符串处理部分

1.71.7 从函数返回字符指针从函数返回字符指针【【例例 1.71.7 】】编程实现编程实现 strcat()strcat() 的功能 的功能

返回字符串首地址

Page 37: 模块一 程序设计基础 (五)字符串处理部分

Questions and answersQuestions and answers