字符串.docx
《字符串.docx》由会员分享,可在线阅读,更多相关《字符串.docx(10页珍藏版)》请在冰豆网上搜索。
![字符串.docx](https://file1.bdocx.com/fileroot1/2023-4/19/718c44b1-6c7d-4124-a746-f30deb690bff/718c44b1-6c7d-4124-a746-f30deb690bff1.gif)
字符串
第十章字符串:
一:
用一个一维数组来存放字符串。
一:
定义字符串:
1.字符串的定义格式:
1)‘\0’是一个转义字符。
称为“空值”。
它的ASCII代码值为0。
‘\0’作为字符串的结束标志占有存储空间,但不计入串的实际长度。
2)strlen计算串的长度时不记‘\0’,sizeof计算串长度时候计算’\0’.a[15]={“S”,“S”}
3)由于字符串以’\0’结尾,所以若要定义一个函有10个字符的字符串,则需要一个11元素的一维字符数组。
例如:
charstr[10]={‘a’,’b’,’c’,’d’,’e’,’f’}
数组str共有10个元素,str作为字符串,其长度为7
2.字符串和字符型数组的区别。
1)一维数组中不一定要存放字符串,但字符串一定要存放在一维数组中,
2)字符数组中的每个元素可存放一个字符,但它并不限定最后一个字符应该是什么
3)可以给字符内存中存放字符串,不能通过赋值语句将字符串常量或其他字符数组中的字符串直接赋给字符串变量。
如:
str1=str2(是错误的)
二:
字符串赋初值;
1.为字符串赋初值
1)在定义语句中赋初值
(1)charstr[10]={‘a’,’b’,’c’,’d’,’e’,’f’}
注意:
数组元素个数一定要多于字符个数。
(2)charstr[10]={“abcdef”};
(3)charstr[10]=”abcdef”;
(4)charstr[]=”abcdef”;
2)在执行语句为字符串赋初值:
(1)在执行语句部分不能直接为字符串赋初值。
例如:
charstr[10];str=”abcdef”;(是错误的)
(2)可以用for循环在执行语句给字符串赋初值。
例如:
ch=’A’;
for(i=0;i<7;i++){str[i]=ch;ch++;}str[i]=’\0’;
2给字符型指针赋初值:
1)在定义语句同时赋初值。
(1)charstr[10]=“abcdef”,*q=str;
(2)char*q=”abcdef”;
2)在执行语句赋初值:
char*q;q=”abcdef”;
3.把字符串赋给字符形数组和赋给字符型指针的区别:
把字符串赋给字符型数组代表在内存中开辟了一片连续的存储单元。
把该字符串放到这片存储单元中去。
把字符串赋给字符形指针,代表一个指针指向一个字符串,但并没有为它开辟存储单元。
一:
输入和输出字符串时的必要条件
1.输出项既可以是字符串或字符数组名,也可以是已指向字符串的字符指针变量。
2.输入项可以是字符数组名,也可以是字符指针,但不能是一个字符串。
二:
用格式说明符%s进行整串输入和输出
1.scanf函数
1)用%s格式输入字符串时,空格和回车都作为输入数据的分隔符而不能被读入;
2)若字符串长度超过字符数组所能容纳的字符个数时,系统并不抱错。
3)当输入项为字符指针时,该指针必须已指向确定的有足够空间的连续存储单元。
4)当输入项是数组元素地址时,输入数据将从这一元素开始存放。
看下面的一个例题:
main()
{chara[10]=”*********”;
scanf(“%s”,a);/*scanf(“%d”,&a[5]);*/
printf(“%s”,a);
}
2.printf函数
调用printf函数时候,将从这一地址开始,依次输出存储单元中的字符,直到遇到第一个‘\0’为止。
‘\0’是结束标志,不在输出字符之列。
输出结束后不自动换行。
三:
调用gets、puts函数,从终端进行字符串行的输入和输出。
例如:
main()
{chara[10]=”abcdef\0g”,*p=a;
printf(“%s\n”,a);
printf(“%s\n”,p);
printf(“%s\n”,”abcdefg”);
printf(“%s.&a[5]”);
printf(“%s\n”,a);
}
1.gets函数。
1)头文件:
#include“stdio.h”
2)格式:
gets(str);
3)gets函数用来从终端键盘读入字符串(包括空格符),直到读入一个换行符为止。
例如:
main()
{chara[10],b[10];scanf(“%s”,a);gets(b);
printf(“%s\n”,a);printf(“%s\n”,a);}
2.puts函数
1)头文件:
#include
2)格式:
puts(str);
3)puts函数输出结束后,自动输出一个换行符。
三:
字符串数组:
一:
概念:
1.所谓字符串数组就是数组中的每个元素都是一个存放字符串的数组。
2.可以将一个二维字符数组看成一个字符串数组,二维字符数组的第一个下标决定了字符串的个数,第二个下标决定了字符串的最大长度。
所以把他看作一个字符串数组。
3.字符串数组也可以在定义的同时赋初值。
例如:
chara[3][5]={“a”,”bb”,”ccc”};
chara[][5]={“a”,”bb”,”ccc”};
4.可以定义字符型指针数组并通过赋初值来构成一个类似的字符串数组。
例如:
char*pa[3]={“a”,”bb”,”ccc”};
二:
字符串数组的操作:
1.输出字符串数组
Main()
{chari,a[3][10]={“abc”,”aa”,”cc”};
for(i=0;i<3;i++)printf(“%s”,a[i]);}
2.字符串排行;
3.通过指针输出字符串
4.main()
{charx[10]=”asqrtpyx!
”,i,j;
for(i=0;i<10;i++)printf(“%c”,x[i]);}
四:
用于字符串处理的库函数
Ø字符串复制(拷贝)函数strcpy,调用形式如下:
strcpy(s1,s2);
功能:
把s2所指的字符串(源)的内容复制到s1所指的存储空间(目的)中,函数返回s1的值,即目的串的首地址;
注意:
为保证复制的合法性,s1必须指向一个足够容纳s2串的空间;
Ø字符串连接函数strcat,调用形式如下:
strcat(s1,s2);
功能:
将s2串连接到s1串的后面,并自动覆盖s1串末尾的’\0’,函数返回s1的地址值;
注意:
s1所指字符串应有足够的空间容纳两串合并后的内容;
Ø求字符串长度函数strlen,调用形式:
strlen(s);
功能:
统计以s为首地址的字符串的长度,并作为函数值返回,这一长度不包括串尾的结束标志’\0’;
Ø字符串比较函数strcmp,调用形式:
strcmp(s1,s2);
功能:
用来比较s1和s2所指字符串的大小,若串s1>串s2,函数值大于0(正数);若s1==s2,函数值等于0;若s1 比较方法:
依次对s1和s2所指的字符串对应位置上的字符两两进行比较,当出现第一对不相同的字符时,即由这两个字符决定所在串的大小(即两个字符的ASCII值相减);
五:
用应:
例1、编写函数slength(char*s),函数返回指针s所指字符串的长度.
#include
slength(char*s)
{intn=0;
while(*(s+n)!
=‘\0’)n++;
returnn;
}
main()
{charstr[]=“ABCDEF”;
intlen1,len2;
len1=slength(“”);
len2=slength(str);
printf(“len1=%d,len2=%d\n”,len1,len2);
}
例2、编写函数scopy(char*s,char*t),将指针t所指的字符串复制到s所指的存储空间中。
#include
voidscopy(char*s,char*t)
{inti=0;
while((s[i]=t[i])!
=‘\0’)i++;
}
main()
{charstr1[20],str2[]=“ABCDEFGH”;
scopy(str1,str2);
puts(str1);
}
例3、编写函数scomp(char*s1,char*s2),将两个字符串进行比较;(即实现strcmp的功能)
#include“stdio.h”
scomp(char*s1,char*s2)
{inti=0;
while(s1[i]==s2[i]&&s1[i])i++;
return(s1[i]-s2[i]);
}
main()
{charstr1[]=“ABC”,str2[10];
gets(str2);
if(scomp(str1,str2)>0)printf(“str1>str2\n”);
elseif(scomp(str1,str2)<0)printf(“str1elseprintf(“str1=str2\n’);
}
例4、编写程序从终端读入若干文本行(不超过40行,每行不超过60个字符),遇空行结束输入,然后将此文本左侧加上行号后输出
#incluce“stdio.h
#defineMAXLINE40
#defineLEN61
voidgettext(char(*t)[LEN],int*m)
{intn=0;
printf(“Entertextline,endedtoemptyline:
\n”);
gets(t[n]);
while(*t[n])
{n++;gets(t[n]);}
*m=n;}
voidputtext(chart[][LEN],intn)
{inti;
for(i=0;i{printf(“%-2d:
”,i+1);puts(t[i]);}
main()
{chartext[MAXLINE][LEN];
intn;
gettext(text,&n);
puttext(text,n);}
例5、编写程序从输入的若干字符串中找出最小的串进行输出
#include“stdio.h”
#include“string.h”
#defineN20
#defineM81
getstr(charp[][M])
{chart[M];intn=0;
gets(t);
while(strcmp(t,“”));
{strcpy(p[n],t);n++;gets(t);}
returnn;}
char*findmin(char(*a)[M],intn)
{char*q;inti;q=a[0];
for(i=1;iif(strcmp(a[i],q)<0)q=a[i];
returnq;}
main()
{chars[N][M],*sp;
intn,I;
n=getstr(s);
sp=findmin(s,n);
puts(sp);}