字符串

资源下载
  1. 二一教育资源

字符串

资源简介

(共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

展开更多......

收起↑

资源预览