首页 第08字符串

第08字符串

举报
开通vip

第08字符串第8章字符串的概念字符数组与指针字符串处理函数字符与字符串的应用字符与字符串在计算机中,任何数据都是以二进制位形式存储和处理的,字符数据用对应的字符编码表示在Windows平台上,常见的编码方案有ASCII、GB-2312、GBK、BIG5、Unicode等在ASCII编码中,每个字符用1个字节(8个二进制位)表示,因此共有28=256个符号,它们的编码依次为0~255,用十六进制表示为0x00~0xFF可将ASCII字符分为两类——可打印字符和不可打印字符,在C语言程序中,可打印字符可以直接书写,而不可打印字符可...

第08字符串
第8章字符串的概念字符数组与指针字符串处理函数字符与字符串的应用字符与字符串在计算机中,任何数据都是以二进制位形式存储和处理的,字符数据用对应的字符编码表示在Windows平台上,常见的编码 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 有ASCII、GB-2312、GBK、BIG5、Unicode等在ASCII编码中,每个字符用1个字节(8个二进制位)表示,因此共有28=256个符号,它们的编码依次为0~255,用十六进制表示为0x00~0xFF可将ASCII字符分为两类——可打印字符和不可打印字符,在C语言程序中,可打印字符可以直接书写,而不可打印字符可以用对应的转义字符表示,例如用‘\n’表示回车符计算机所处理的字符数据有时是分散的单一字符,如‘a’、‘0’、‘\n’、‘\x20’等,但更多的时候是若干字符的组合,如“Beijing”、“OneWorldOneDream”等通常把若干字符的组合看作一个整体,称为字符串字符串的存储方法C语言中,程序中的字符串使用双引号“"”作定界符,字符串以字符'\0'为结束标识,字符'\0'并不显式地出现在字符串中字符串在内存中占据相邻的存储单元,字符串的首地址是该字符串的第一个字符的地址,其他字符按顺序依次存放在第一个字符的后边,最后是字符串的结束标识‘\0’Olympic01234567字符串地址58A0games\089ABCD字符数组字符数组是数据类型为字符的数组,其定义格式为:char数组名[数组长度]字符数组中存放的字符可以组成字符串,此时至少有一个元素为'\0',从左边算起的第一个'\0'是该字符串的结束符字符数组中没有‘\0’元素,就不能按字符串处理字符数组的初始化方法:chara[]={'C','','L','a','n','g','u','a','g','e','\0'};charb[]={67,32,76,97,110,103,117,97,103,101,0};charc[]={"CLanguage"};chard[]=“CLanguage";若某字符数组中存放了一个字符串,程序中通常只会关心字符串的长度,而较少考虑数组长度求字符串的长度1字符串的长度是字符串中位于结束标识'\0'(对应整数0)之前的所有字符的个数,也就是从数组的第一个元素开始到第一个0元素为止所有非0元素的个数#includevoidmain(){charstr[]="BeijingOlympicgames";inti,iLength=0;while(str[iLength]!='\0')iLength++;printf("Lengthofstring:\n");for(i=0;i#defineN20voidmain(){inti,word[N];printf("输入一句话,以#结束:\n");i=0;scanf("%s",word);while(word[0]!='#'){i++;scanf("%s",word);}printf("共输入了%d个单词\n",i);}gets函数和puts函数使用gets函数可输入一句话(包含空格、制表符),其语法为:gets(字符数组)存入字符数组的是一个字符串(以'\0'结束),但不包括回车符chars[100];gets(s);若输入是(“_”为空格):__I'm_a_sport__则s的 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 为"__I'm_a_sport__"使用puts函数输出字符串,会在结束时自动换行,其语法为:puts(字符数组或字符串常量)输入一句话,统计字母的个数3方法是,将输入的句子存放在一个字符数组中,然后从第1个字符开始做逐一判断,以确定该字符是不是字母,直至句子结束#include#defineN256voidmain(){charstr[N];inti,iCount=0;puts("输入一句话:");gets(str);for(i=0;str[i]!=0;i++)if(('A'<=str[i]&&str[i]<='Z')||('a'<=str[i]&&str[i]<='z'))iCount++;puts("输入的句子是:");puts(str);printf("其中包含%d个字母。\n",iCount);}sprintf函数的使用4sprintf函数可将要输出到终端的内容先以字符串方式存放在字符数组中,以便作进一步处理,其一般格式是:sprintf(字符数组名,格式控制字符串,输出表列)#includevoidmain(){intx=5;floaty=3.4567;charstrBuffer[256];sprintf(strBuffer,"x=%3d\ty=%5.2f",x,y);puts(strBuffer);}字符指针字符指针是指向字符串的指针,定义为:char*指针;可以用字符数组为指针赋值chara[]="WelcometoBeijing.";char*p=a;也可以用字符串常量的地址为指针赋值char*p="Hello";由于p为指针变量,指针指向是可以改变的char*p="Hello",*q=p;p="world";如果x为字符数组,则令x="abc"是错误的字符数组和字符指针的比较Hello\0Hello\03AB8数组aAA02指针pchara[]="Hello";char*p="Hello";AA02截取并输出任意字符串的前n个字符5若字符数组中存放了一个字符串,要截取前n个字符,只需将字符数组的第n+1个字符置为'\0'即可#includevoidmain(){charcData[256];char*p=cData;intn;puts("请输入一串字符:");gets(p);puts("要截取前几个字符?");scanf("%d",&n);if(n<0||n>256){puts("输入参数错误!");exit(0);}p=p+n;*p='\0';printf("截取结果为:%s",cData);}思考:如果输入的字符串的长度比n小,结果怎样?输入一个字符串,然后把其中的大写字母转化为小写字母,输出转化后的字符串6#includevoidmain(){charcData[256];char*p,*q=cData;inti=0;printf("输入一串字符:");gets(q);for(p=q;*p!='\0';p++)if(*p>='A'&&*p<='Z'){i++;*p=*p+'a'-'A';}printf("转换后为:%s\n",q);printf("共转换了%d个大写字母\n",i);}字符串数组字符串数组程序要处理的字符串通常不止一个,例如,某班同学的姓名,某本书的词汇表,某文档中的语句行等等字符串数组是存放了若干字符串的字符数组,是一个二维数组,每个字符串占一行,字符串的个数对应数组的行数字符串数组的定义为:char数组名[字符串个数][字符串长度]要引用字符串数组中的字符串,可使用行地址第i个字符串的地址为:数组名[i]、*(数组名+i)某班有10名同学参加考试,求成绩最高的学生的姓名7#include#defineN3voidmain(){charsName[N][10];inti,t,iScore[N];printf("顺序输入每个姓名和成绩(用空格分开):\n");for(i=0;iiScore[t])t=i;printf("%s的成绩最好,为%d\n",sName[t],iScore[t]);}程序要处理的数据包括学生姓名、考试成绩,核心是确定10个人谁的成绩最高,也就是求最大值指向字符串数组的指针定义指向字符串数组的指针的方法是:char(*指针)[字符串长度]其中,“字符串长度”必须与字符串数组相同指向字符串数组的指针8#includevoidmain(){charsFruit[5][10]={"Apple","Pear","Banana","Peach","Plum"};char(*p)[10];p=&sFruit[1];puts(*p);p=sFruit+3;printf("%s",p);}字符指针的数组如果数组元素是字符指针,每个指针指向一个字符串,则该数组为字符指针的数组,定义为:char*指针[数组长度]字符指针的数组9#includevoidmain(){char*a="Beijing",*b="Shanghai";char*pArray[]={a,b};inti;for(i=0;i<2;i++)puts(pArray[i]);}C语言函数库提供了大量的字符串处理函数,极大地丰富了处理字符串的手段要使用字符串处理函数,程序中需要包含:#include复制与连接strcpy和strncpy函数两个函数的一般形式是:strcpy(字符数组1,字符串2)strncpy(字符数组1,字符串2,整数n)strcpy函数的功能是将“字符串2”对应的字符串全部复制到“字符数组1”中,结果两个字符串相同。而strncpy函数最多复制前n个字符“字符数组1”的长度必须足够容纳复制后的字符串“字符串2”可以是存放了字符串的字符数组,也可以是字符串常量,或者指向字符串的指针chara[10],b[]="China";strcpy(a,b);China\0数组b数组a(a)复制前China\0China\0数组b数组a(b)复制后交换两个字符串10方法1:采用字符数组存放字符串#include#include#defineN40voidmain(){charstr1[N]="apple";charstr2[N]="watermelon";charstr3[N];printf("(%s,%s)",str1,str2);strcpy(str3,str1);strcpy(str1,str2);strcpy(str2,str3);printf("=>(%s,%s)",str1,str2);}方法2:采用字符指针指向字符串#include#includevoidmain(){char*str1="apple";char*str2="watermelon";char*str3;printf("(%s,%s)",str1,str2);str3=str1;str1=str2;str2=str3;printf("=>(%s,%s)",str1,str2);}(a)交换前(b)交换后applewatermelonstr2str1str3applewatermelonstr2str1str3str2str1(a)交换前(b)交换后applewatermelonstr3str2str1watermelonapplestr3apple交换字符数组中的字符串交换字符指针指向的字符串方法3:用指针操作数组#include#include#defineN20voidmain(){charstr1[N],str2[N];char*ps1=str1,*ps2=str2;char*ps3;printf("输入两个字符串,用空格分开:");scanf("%s%s",ps1,ps2);ps3=ps1;ps1=ps2;ps2=ps3;printf("交换后为:%s%s",ps1,ps2);}strcat和strncat函数两个函数的一般形式为:strcat(字符数组1,字符串2)strncat(字符数组1,字符串2,整数n)strcat函数将“字符串2”附加在“字符数组1”中的字符串的后边,也就是把两个字符串连接起来再存入“字符数组1”。而strncat函数仅把“字符串2”的前n个字符连接到“字符数组1”的字符串后边chara[80]="I'ma",b[]="student",c[]="sportfromChina";strcat(a,b)后a的内容为"I'mastudent"strncat(a,c,5)后a的内容为"I'masport"“字符数组1”中的字符串结束符在连接“字符串2”后将被丢弃比较大小字符串的大小由字符串中的字符的编码决定对于任意两个字符串,从它们的第一个字符开始比较,若相同,则继续比较下一个字符,直到出现不同的字符或者遇到了结束符。若存在不同的字符,则编码较大的字符所在的字符串较大。如果同时遇到结束符,则两个字符串相等"ABC"小于"AbC""ABC"大于"AB""123"等于"\x31\x32\x33"关系运算符不能用来比较字符串的大小,只能使用库函数strcmp、strncmp和stricmp函数函数的一般形式:strcmp(字符串1,字符串2)strncmp(字符串1,字符串2,整数n)stricmp(字符串1,字符串2)函数的函数值都是整型的,如果函数值为0,表示两个字符串相等;如果函数值大于0,则“字符串1”大于“字符串2”;如果函数值小于0,则“字符串1”小于“字符串2”strcmp函数是最常用的函数之一,从左到右逐一比较每个字符,直到遇到不同的字符或遇到字符串结束为止strncmp函数只比较两个字符串的前n个字符用stricmp函数比较两个字符串时,将忽略字母符号的大小写求若干字符串中的最大字符串11实际上,这也是一个求最大值问题#include#include#defineN10voidmain(){charstrWord[N][20];inti,iMax;printf("顺序输入%d个字符串,用空格分开:\n",N);for(i=0;i0)iMax=i;printf("第%d个字符串最大,为:%s",iMax+1,strWord[iMax]);}strstr函数strstr函数的一般形式为:strstr(字符串1,字符串2)strstr函数的功能是在“字符串1”中查找“字符串2”,如果找不到,则函数返回空指针NULL,若找到了,则返回与“字符串1”中所包含的“字符串2”的首字符对应的指针如果“字符串1”中包含“字符串2”,那么“字符串2”常被称作“字符串1”的子串判断一个字符串中是否包含一个子串12#include#includevoidmain(){char*pSrc="oneworld,onedream.";char*ps1="World",*ps2="one";char*p;printf("字符串:%s\n",pSrc);if((p=strstr(pSrc,ps1))==NULL)printf("未找到子串%s\n",ps1);elseprintf("子串%s在第%d位\n",ps1,p-pSrc+1);if((p=strstr(pSrc,ps2))==NULL)printf("未找到子串%s\n",ps2);elseprintf("子串%s在第%d位\n",ps2,p-pSrc+1);}变换strlwr和strupr函数两个函数的一般用法是:strlwr(字符数组)strupr(字符数组)strlwr函数将存放在“字符数组”中的字符串的所有大写字母转化为小写字母,而strupr函数则相反转换后得到的字符串仍存放在“字符数组”中atoi和atof函数这两个函数的原型在stdlib.h中,一般用法是:变量=atoi(字符串)变量=atof(字符串)atoi函数将“字符串”转化成整数,并作为函数值返回,而atof函数则转化为实数任意输入一个加法算式,格式为“整数1+整数2=”,例如“23+32=”,计算并打印出结果。注:算式中,开始位置、“+”和“=”的前后都可以有空格13输入时,如果“+”的后面必有空格,用scanf("%d+%d=",&a,&b)即可获得正确的输入。如果“+”的后面没有空格,那么用scanf("%d%1s%d=",&a,s,&b)(s为字符数组名)也可获得正确的输入。但这些方法都不能处理非法的输入。本例的方法是:将输入的“算式”存放在字符数组中;用atoi函数提取字符串中的第1个加数,若提取失败则显示出错并中断程序运行;截取剩余的字符组成新的字符串;判断新的字符串的第一个非空格字符是否为“+”,如果不是,则显示出错并中断程序运行;截取“+”后的字符串;用atoi函数提取第2个加数,若失败则显示出错并中断程序运行;截取剩余的字符串;若剩余字符串中的只有一个非空格字符“=”,则完成计算。否则显示出错。#include#includevoidmain(){inta,b,c;chars[20],*p=s;printf("输入算式(形如“a+b=”):");gets(p);if((a=atoi(p))==0){printf("错误:不能提取整数\n");exit(0);}while(*p==''||(*p>='0'&&*p<='9'))p++;if(*p!='+'){printf("错误:请输入“+”\n");exit(0);}p++;if((b=atoi(p))==0){printf("错误:不能提取整数\n");exit(0);}while(*p==''||(*p>='0'&&*p<='9'))p++;if(*p!='='){printf("错误:请输入“=”\n");exit(0);}printf("%d\n",a+b);}其他函数用strlen函数可计算字符串的长度,用法是:变量=strlen(字符串)strlen函数的函数值是一个整数,表示“字符串”的长度,即结束符'\0'前的字符的个数与sizeof(字符串)不同,用strlen函数求得的并不是所占内存的字节数输入两个字符串,然后把它们连接起来形成一个字符串,再输出到屏幕上14方法1:使用strcat函数#include#includevoidmain(){chars1[256],s2[256];puts("输入2个字符串:");gets(s1);gets(s2);strcat(s1,s2);printf("连接后为:%s\n",s1);}方法2:使用数组#includevoidmain(){chars1[256],s2[256];inti=0,j=0;puts("输入2个字符串:");gets(s1);gets(s2);while(s1[i]!='\0')i++;while(s2[j]!='\0'){s1[i]=s2[j];i++;j++;}s1[i]='\0';printf("连接后为:%s\n",s1);}方法2:使用指针#includevoidmain(){chars1[256],s2[256];char*p1=s1,*p2=s2;puts("输入2个字符串:");gets(s1);gets(s2);while(*p1!='\0')p1++;while(*p2!='\0'){*p1=*p2;p1++;p2++;}*p1='\0';printf("连接后为:%s\n",s1);}#includevoidmain(){chars1[256],s2[256];char*p1=s1,*p2=s2;puts("输入2个字符串:");gets(s1);gets(s2);while(*p1!='\0')p1++;while(*p1++=*p2++);*p1='\0';printf("连接后为:%s\n",s1);}将字符串倒置后再打印出来15不同于数值数组的倒置,对于存放了字符串的字符数组,倒置仅仅是对结束符前的字符进行的apple\0字符数组selppa\0字符数组s(a)倒置前(b)倒置后方法1:使用数组#includevoidmain(){charstrTemp[256],ch;inti,j;printf("输入一串字符:");gets(strTemp);i=j=0;while(strTemp[j]!='\0')j++;j--;while(ivoidmain(){charstrTemp[256],ch;char*p1,*p2;printf("输入一串字符:");gets(strTemp);p2=p1=strTemp;while(*p2!='\0')p2++;p2--;while(p1#include#defineN10#defineM10voidmain(){charsData[N][M],sTemp[M];inti,j,k,n;printf("输入字符串的个数(1~%d):",N);doscanf("%d",&n);while(n<0||n>N);printf("依次输入%d个单词:",n);for(i=0;i0)k=j;if(k!=i){strcpy(sTemp,sData[k]);strcpy(sData[k],sData[i]);strcpy(sData[i],sTemp);}}printf("排序后:");for(i=0;i#include#defineN10#defineM10voidmain(){charsData[N][M];char*pStr[N],*pTemp;inti,j,k,n;printf("输入字符串的个数(1~%d):",N);doscanf("%d",&n);while(n<0||n>N);printf("依次输入%d个单词:",n);for(i=0;i0)k=j;if(k!=i){pTemp=pStr[k];pStr[k]=pStr[i];pStr[i]=pTemp;}}printf("排序后:");for(i=0;i
本文档为【第08字符串】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_136084
暂无简介~
格式:ppt
大小:2MB
软件:PowerPoint
页数:0
分类:
上传时间:2010-09-11
浏览量:25