字符串

文档属性

名称 字符串
格式 zip
文件大小 99.6KB
资源类型 教案
版本资源 通用版
科目 信息技术(信息科技)
更新时间 2010-09-16 19:29:00

图片预览

文档简介

(共38张PPT)
11.1 字符串的存储形式
11.2 指针与字符串
11.3 字符串的输出
11.4 字符串的输入
11.5 字符串数组
11.6 对字符串的操作
第十一章 字符串
11.1.1 字符串常量
11.1.2 使用一维字符数组存放字符串
11.1.3 将字符串赋给字符数组
11.1 字符串的存储形式
11.1.1 字符串常量
字符串常量
定义:以双引号括起来的,由若干个字符所组成的序列即为字符串常量。
存储形式:
在C中,一个字符用一个字节来存放。
字符串在内存中占的存储空间=字符串长度+1;末尾一位存放结尾符’\0’。
说明:在C中没有字符串数据类型,却有”字符串常量”。
例 “hello”共5个字符,在内存占6个字节 字符串长度5 ,其存储形式为:
h
e
l
l
o
\0
104
101
108
108
111
\0
转义字符,ASCII码值为0, 空值
内存存放字符ASCII码
例 char ch[5]={’B’,’o’,’y’,’\0’};
ch[0]
B
o
y
\0
\0
用字符串常量
ch[1]
ch[2]
ch[3]
ch[4]
在C中,可通过一维字符数组处理字符串。每个字符数组的元素都是一个字符,当这些数组元素的最后一个字符是’\0’时,我们就认为该字符数组保存的是一个字符串。
11.1.2 使用一维字符数组存放字符串
11.1.3 将字符串赋给字符数组
通过对单个元素赋值
方式:
在定义字符数组时对单个数组元素进行赋值。
在使用时对字符串进行赋值。
注意:
字符数组大小必须定义足够大,以便能够保存后面给出的字符串常量,同时也要考虑到字符串结尾符’\0’也占用一个字节,因此字符串长度必须小于字符数组的大小
在字符串的末尾必须赋空值’\0’,用以表示字符串结束
若在字符数组中没有元素存放字符串结尾符’\0’,则表示该字符数组保存的不是字符串。
当所赋初值少于所定义数组的元素个数时,将自动给后面的元素补以初值0
例 char ch[5]={’B’,’o’,’y’,’\0’};
//定义字符数组时对单个元素赋值
例 char ch[5];
ch[0]=’B’;
ch[1]=’o’;
ch[2]=’y’;
ch[3]=’\0’;
//使用时对字符串进行赋值
没有‘\0’,不能作为字符串用!
例 char ch[5]={‘H’,’e’,’l’,’l’,’o’};
ch[0]
H
e
l
l
o
逐个字符赋值
ch[1]
ch[2]
ch[3]
ch[4]
例 char ch[5]={’B’,’o’,’y’,’\0’};
等价于:
char ch[5]={’B’,’o’,’y’};
比较:
char ch1[10]={‘H’ ,’e’ ,’l’ ,’l’ ,’o’};
char ch2[]={‘H’,’e’,’l’,’l’,’o’,’\0’};
char ch3[5]={‘H’ ,’e’ ,’l’, ’l’ ,’o’};
h
e
l
l
o
\0

h
e
l
l
o

h
e
l
l
o
\0

\0
\0
\0
\0
字符串
非字符串
直接把字符串常量赋给字符数组
例 char ch[6]={“Hello”};
char ch[6]=“Hello”;
char ch[]=“Hello”;
用字符串常量
ch[0]
H
e
l
l
o
ch[1]
ch[2]
ch[3]
ch[4]
\0
ch[5]
注意:如果不是在定义时赋值,则须单个元素逐个赋值。
例: char str[10];
str=“Hello”
×
说明:
区分字符常量和字符串常量:字符常量是用单引号引起来的单个字符,字符串常量是用双引号引起来的字符序列,当然,字符序列可以为空,也可以是一个字符。
例:
“”表示空串,在内存中保存的是空字符‘\0’,占一个字节。
“A”表示含有一个大写字母A的字符串,在内存中保存的是字母A和空字符‘\0’,占两个字节。
‘A’表示字母A,在内存中占一个字节。
“ABCDEF”表示含有6个字母的字符串,在内存中占7个字节。
处理字符串常量的时候,字符串结束标志是编译系统自动添加的,不用人为的在字符串最后加上‘\0’ 。
字符数组的引用:
【例】从键盘输入一行字符,存放在字符数组中,然后
逆序输出。
main()
{char a[80],c;
int k=0,j;
printf("\nplease input the chars: ");
scanf("%c",&c);
while(c!= '\n')
{a[k++]=c;
scanf("%c",&c);
}
printf("\n");
for(j=k-1;j>=0;j--)
printf("%c",a[j]);
}
11.2 指针与字符串
在C中,可通过一维字符数组处理字符串,也可通过字符指针处理字符串。
用字符数组实现:

main( )
{ char str[]=“I love China!”;
printf(“%s\n”,str);
printf(“%s\n”,str+7);
}
I
l
o
v
e
C
h
i
str[0]
str[1]
str[2]
str[3]
str[4]
str[5]
str[6]
str[7]
str[8]
str[9]
str
str[10]
str[11]
str[12]
str[13]
n
!
a
\0
用字符指针实现
例 main( )
{ char *str=“I love China!”;
printf(“%s\n”,str);
str+=7;
while(*str)
{ putchar(str[0]);
str++;
}
}
I
l
o
v
e
C
h
i
str
n
!
a
\0
字符指针初始化:把字符串首地址赋给str
char *str;
str=“I love China!”;
str
*str!=0
用字符指针实现
注意:
(1)str是一个存放字符串起始地址的指针变量,不是一个字符串变量。
(2)在程序中出现字符串常量时,系统返回的是一个起始地址,因此可以将一个字符串常量赋值给一个字符指针变量。
例: char str[14];
str=“I love China”; 是错误的!
在这里,str是一个字符数组,数组名str是一个指针常量,第二条语句相当于把字符串“I love China”的首地址赋给str,试图改变str的值
I
l
o
v
e
C
h
i
str
n
!
a
\0
字符指针初始化:把字符串首地址赋给str
char *str;
str=“I love China!”;
字符数组和字符指针处理字符串方式的区别:
字符数组的每个元素存放字符串的每一个字符,末尾存放‘\0’。
字符指针是指向为字符串开辟的内存空间,其值存放的是字符串的首地址。
数组str:
h
e
l
l
o
\0
例:char str[]=“hello”,*pstr=“spels”;内存表示形式如下:
指针str:
h
e
l
l
o
\0
11.3.1 使用printf函数输出字符串
11.3.2 使用puts函数输出字符串
11.3 字符串的输出
通过C语言系统提供的库函数,可以对整个字符串进行输出。
使用printf函数输出字符串
在printf的输出格式中,%s代表字符串,可以通过该格式输出字符串。
例 char str[]=“Hello,Spels!”;
printf( “%s”, str)
输出结果:Hello,Spels!
例 char str[]=“Hello,Spels!”;
printf( “%s”, str+6)
输出结果:Spels!
例 char str[]=“Hello\0,Spels!”;
printf( “%s”, str+6)
输出结果:Hello
11.3.1 使用printf函数输出字符串
11.3.2 使用puts函数输出字符串
使用puts函数输出字符串
程序在使用puts来对字符串进行输出时,要在程序中包含头文件stdio.h。
puts函数在输出完字符串后,会自动输出一个换行符。
puts函数的调用格式:
puts(字符串首地址);
例 char *pstr=“Hello,Spels!”;
puts(pstr);
输出结果:Hello,Spels!
例 char str[]=“Hello,Spels!”;
puts(str);
11.4.1 输入字符串的必要条件
11.4.2 使用scanf函数输入字符串
11.4.3 使用gets函数输入字符串
11.4 字符串的输入
与字符串的输出类似,也可以通过库函数来对整个字符串进行输入。
输入字符串的必要条件
输入项可以是一个字符数组名,这样输入的字符串将存放到该数组中,此时数组应该足够大,以能保存输入的字符串。
输入项还可以是字符指针,这里的字符指针必须是已经指向确切的、足够大的存储空间,以便输入的字符串可以存放到该指针所指向的内存空间中。
11.4.1 输入字符串的必要条件
11.4.2 使用scanf函数输入字符串
使用scanf函数输入字符串
在scanf中,可以使用格式%s来输入一个字符串。
例: char str[20];
scanf (“%s” ,str);
说明:
使用scanf通过%s格式进行输入时,输入的空格和回车都会被认为是数据的分隔符,而不作为数据被读入。
如果输入项是数组元素的地址时,输入数据将从这一地址开始存放。
11.4.3 使用gets函数输入字符串
使用gets函数输入字符串
程序在使用puts来对字符串进行输出时,要在程序中包含头文件stdio.h。
gets函数的调用格式:
gets(待输入字符串首地址);
例 char str1[20];
getts(str1);
执行上面语句,若从键盘输入:
Hi spels!(此处CR代表Enter键,且Hi和spels!中间有空格)
则系统将读入10个字符,包括空格和回车符,依次存放在数组str1中,系统自动用’\0’来取代最后的回车符。
字符串的输入输出
逐个字符I/O: %c
整个字符串I/O: %s
例 用%c
main()
{ char str[5];
int i;
for(i=0;i<5;i++)
scanf(“%c”, &str[i]);
for(i=0;i<5;i++)
printf(“%c”, str[i]);
}
例 用%s
main()
{ char str[5];
scanf(“%s”, str);
printf(“%s”, str);
}
用字符数组名,不要加&
输入串长度<数组维数
遇空格或回车结束
自动加‘\0’
用字符数组名,
遇‘\0’结束
应用举例:
例 main( )
{ char a[5]={‘H’,’e’,’l’,’l’,’o’};
printf(“%s”,a);
}
例 main( )
{ char a[ ]=“Hello”;
printf(“%s”,a);
}
结果:Hello#-=*
h e l l o
0
2
3
1
4
结果:Hello
用“%s”输出时,遇‘\0’结束
main()
{
char a[]={'h','e','l','\0','l','o','\0'};
printf("%s",a);
}

输出:hel
h e l \0 l o \0
数组中有多个‘\0’时,
遇第一个结束
main()
{
int i;
char a[5];
scanf("%s",a);
for(i=0;i<5;i++)
printf("%d,",a[i]);
}
运行情况:
(1)若输入 hel , 正常
(2)若输入 hell , 正常
(3)若输入 hello , 用%s 输出时,会出现问题
h e l \0
h e l l \0
h e l l o
输入字符串长度<数组维数
例 字符串输入举例
H o w \0
a r e \0
y o u \0
#include
main()
{ char a[15],b[5],c[5];
scanf("%s%s%s",a,b,c);
printf("a=%s\nb=%s\nc=%s\n",a,b,c);
scanf("%s",a);
printf("a=%s\n",a);
}
运行情况:
输入:How are you
输出:a=How
b=are
c=you
输入:How are you
输出:a=How
scanf中%s输入时,遇空格或回车结束
运行情况:
输入:How are you
例 若准备将字符串“This is a string.”记录下来,
错误的输入语句为:
(A)scanf(“%20s”,s);
(B)for(k=0;k<17;k++)
s[k]=getchar();
(C)while((c=getchar())!=‘\n’)
s[k++]=c;
11.5.1 二维字符数组存放字符串数组
11.5.2 指针数组处理字符串数组
11.5 字符串数组
11.5.1 二维字符数组存放字符串数组
字符串数组,即数组中的每一个元素存放的都是一个字符串,在C中,可以通过二维字符数组或一维指针数组来处理。
二维字符数组存放字符串数组
二维数组可以看作是一个一维数组,该数组中的每一个元素又是一个一维数组。如果这些一维数组中存放的都是字符串,那么这个二维数组保存的就是一个字符串数组。
如:char str[5][20];
可以把这个二维数组看作是一个由5个字符串组成的一维数组,每个字符串的长度最大可以是19个字符。
例 char name[4][20]={“I”, ”am”, ”a” ,”teacher”};
或 char name[][20]= {“I”, ”am”, ”a” ,”teacher”};
二维数组name存放的就是一个字符串数组,name[0]、name[1]、name[2]、name[3]分别存放了“I”, ”am”, ”a” ,”teacher”四个字符串。可以调用puts(name[i])来对以下字符串进行输出,其中i的取值应该是0~3之间。
11.5.2 指针数组处理字符串数组
指针数组处理字符串数组
可以定义一个一维字符指针数组,来处理字符串数组。若字符指针数组中的每一个元素都指向字符串,即可以认为该指针数组处理的是一个字符串数组。
例 char *pname[4]={“I”, ”am”, ”a” ,”teacher”};或
char pname[]= {“I”, ”am”, ”a” ,”teacher”};
pname中的四个元素pname[0]、pname[1]、pname[2]、pname[3]分别指向“I”, ”am”, ”a” ,”teacher”四个字符串。
系统通过无名的一维字符数组来存储这些字符串,各字符串之间并不一定占用连续的存储单元。
一旦pname中的元素被重新赋值,如果没有其他字符指针指向相应的字符串,则相应的字符串将会丢失。
可以通过pname[i]来引用上述字符串或者通过pname[i][j]来引用该字符串中的字符。
11.6.1 字符串拷贝
11.6.2 求字符串长度
11.6.3 字符串链接
11.6.4 字符串比较
11.6 对字符串的操作
11.6.1 字符串拷贝
程序:
char *strcopy(char *d,char *s)
{ char *p=d;
while(*s!=‘\0’)
{ *p=*s;
p++;
s++;
}
*p=‘\0’;
return d;
}
字符串拷贝
例 编写函数strcopy(char *d,char *s),将指针s所指向的字符串复制到指针d所指向的存储空间中。
相应库函数:
C语言系统为用户提供了库函数strcpy可以实现以上函数功能。
调用格式: strcpy(d,s);
功能:把s指向的字符串拷贝复制到d指向存储空间。
说明:
调用此函数时,程序必须包含string.h头文件
d所指向的空间长度必须足够容纳s串
拷贝时‘\0’一同拷贝
不能使用赋值语句为一个字符数组赋值
例 char str1[20],str2[20];
str1={“Hello!”}; ( )
str2=str1; ( )
11.6.2 求字符串长度
程序:
int strcopy(char *str)
{ int i=0;
while(str[i]!=‘\0’)
i++;
return i;
}
求字符串长度
例 编写函数strlength(char *str),求字符串str的字符串长度。
相应库函数:
C语言系统为用户提供了库函数strlen可以实现以上函数功能。
调用格式: strlen(s);
功能:此函数返回s指向的字符串的实际长度,不包括‘\0’在内。
说明:
调用此函数时,程序必须包含string.h头文件
可以把该函数的返回值赋给一个整型变量,如len=strlen(s)
例 对于以下字符串,strlen(s)的值为:
(1)char s[10]={‘A’,‘\0’,‘B’,‘C’,‘\0’,‘D’};
(2)char s[ ]=“\t\v\\\0will\n”;
(3)char s[ ]=“\x69\082\n”;
11.6.3 字符串链接
程序:
char *strcatt(char *d,char *s)
{ int len;
len= strlen(d);
d+=len;
while(*s!=‘\0’)
{ *d=*s;
d++;
s++;
}
*d=‘\0’;
return d;
}
字符串链接
例 编写函数strcatt(char *d,char *s),将s所指向的字符串复制到指针d所指向字符串后面。
该函数先求出d字符串的长度,然后把指针d移动到字符串d的末尾,最后通过while循环把s所指向的字符串的字符依次赋给d指向的字符串的后面
相应库函数:
C语言系统为用户提供了库函数strcat可以实现以上函数功能。
调用格式: strcat(d,s);
功能:把s指向的字符串复制到d指向的字符串的后面。
说明:
调用此函数时,程序必须包含string.h头文件
d所指向的空间长度必须足够容纳d字符串以及s字符串
连接前,两串均以‘\0’结束;连接后,串1的‘\0’取消,新串最后加‘\0’
例 strcpy与strcat举例
#include
#include
void main()
{ char str1[25];
char str2[] = " ", c[]= "C++",
str3[] = "str3";
strcpy(str1, str3);
strcat(str1, str2);
strcat(str1, c);
printf("%s\n", str1);
}
T
r
b
o
C
+
+
0
1
2
3
4
5
6
7
8
9
u
\0
24
…….
T
r
b
o
0
1
2
3
4
5
6
7
8
9
u
\0
24
…….
…….
T
r
b
o
\0
0
1
2
3
4
5
6
7
8
9
u
24
…….
…...
11.6.4 字符串比较
程序:
int strcompare(char *s1,char *s2)
{ while(*s1==*s2&&*s1)
{ s1++;
s2++;
}
return (*s1-*s2);
}
字符串比较
例 编写函数strcompare(char *s1,char *s2),将两个字符串s1和s2进行比较,若s1大于s2,函数返回正值;若s1等于s2,函数返回0;若s1小于s2,函数返回负值。
字符串比较,即把两个字符串相对应的字符拿出来进行比较,返回第一个不相等的字符比较出来的大小即可
相应库函数: C语言系统为用户提供了库函数strcmp可以实现以上函数功能。
调用格式: strcmp(s1,s2);
功能:比较两个字符串
比较规则:对两串从左向右逐个字符比较(ASCII码),直到遇到不同字符或‘\0’为止
返值:返回int型整数,a. 若字符串1< 字符串2, 返回负整数
b. 若字符串1> 字符串2, 返回正整数
c. 若字符串1== 字符串2, 返回零
说明:
调用此函数时,程序必须包含string.h头文件
字符串比较不能用“==”,必须用strcmp
#include
#include
main()
{ char str1[] = ”Hello!", str2[] = ”How are you ”,str[20];
int len1,len2,len3;
len1=strlen(str1); len2=strlen(str2);
if(strcmp(str1, str2)>0)
{ strcpy(str,str1); strcat(str,str2); }
else if (strcmp(str1, str2)<0)
{ strcpy(str,str2); strcat(str,str1); }
else strcpy(str,str1);
len3=strlen(str);
puts(str);
printf(”Len1=%d,Len2=%d,Len3=%d\n”,len1,len2,len3);
}
例 strcmp与strlen举例
How are you Hello!
Len1=6,Len2=12,Len3=18
同课章节目录