C语言,第8章字符串_第1页
C语言,第8章字符串_第2页
C语言,第8章字符串_第3页
C语言,第8章字符串_第4页
C语言,第8章字符串_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章字符串2回顾一维数组的定义、初始化一维数组元素输入/输出二维数组的定义、初始化二维数组元素的输入/输出必须用数组处理的一些问题3教学目标理解字符串常量理解字符数组和字符串的异同使用字符串输入/输出函数使用字符串处理函数理解指针与字符串的关系使用字符指针数组使用字符串作为函数参数4字符串简介chara='W';charb='a';charc='n';chard='g';chare='L';charf='i';如何让程序存储我的姓名?WangLicharname[15]={'W','a','n','g','L','i'};用若干个字符用字符数组用字符串5字符串常量字符串常量是双引号括起的任意字符序列"HelloWorld""WangPing""Pleaseenteryourfullname:""Hello\"UPC\""字符串常量中可以包含转义序列HelloWorld\0字符串结束符6字符串与字符数组在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串字符串一串以'\0'结尾的字符在C语言中被看作字符串用双引号括起的一串字符是字符串常量,C语言自动为其添加'\0'终结符C语言并没有为字符串提供任何专门的表示法,完全使用字符数组和字符指针来处理字符数组每个元素都是字符类型的数组,如charname[20];字符数组和字符串的区别是:字符串的末尾有一个空字符'\0'7一维字符数组的初始化字符串可按如下方式声明并初始化:1.用字符型数据对数组进行初始化charname[15]={'W','a','n','g','L','i','\0'};2.用字符串常量直接对数组初始化

charname[15]="WangLi";charpassword[]="12345678";手工加入一个空字符系统将自动加入一个空字符省略数组大小,系统自动计算,大小为后面的字符总数加1,最后一个元素存入一个空字符。8一维字符数组的初始化

问题:charch[6]="123456";charch[6]="1234567";charch[6]="123";输出数组元素的结果是什么?9一维字符数组举例统计字符串中每个字符出现的次数。基本思路:开一个“统计数组”记录每个字符出现的次数。关键:每个字符与数组中进行计数的元素之间的对应关系。方法:根据ASCII码的性质,将字符作为统计数组中元素的下标。intcount[128];10一维字符数组举例#include<stdio.h>intcount[128];/*统计数组,初始化时全为0*/intmain(){charline[200];intk=0;printf(”\nEnterString:”);gets(line);while(line[k]!=’\0’)/*对字符进行统计*/count[line[k++]]++;/*将字符作为下标*/for(k=0;k<=127;k++)/*输出统计结果不为0的字符*/if(count[k]>0)printf(”%c=%d\t”,k,count[k]);return0;}11一维字符数组举例输入一行字符,将其中的每个字符从小到大排列后输出。#include<stdio.h>intmain(){

charstring[100],t;

inti,j,n;

gets(string);

n=strlen(string);

for(i=0;i<n;i++)/*冒泡法排序*/

for(j=0;j<n-1-i;j++)

if(string[j]>string[j+1])

{

t=string[j];

string[j]=string[j+1];

string[j+1]=t;

}

puts(string);return0;}12二维字符数组二维字符数组的定义和初始化可将二维数组当作一维数组使用,这个一维数组中的每个元素是个一维数组。chara[3][8]={"str1","str2","string3"};charb[][6]={"s1","st2","str3"};

chara[2][3],b[3][5];str1str2\0\0string3\0\0\0\0\0\0\0a[0]a[0][0]a[1]a[2]数组a初始化后的存储情况13二维字符数组二维字符数组的引用for(i=0;i<2;i++)printf("%s\n",a[i]);/*输出i行字符串*/for(i=0;i<2;i++)printf("%c\n",a[i][i]);/*输出i行i列字符*/for(i=0;i<2;i++)printf("%s\n",&a[i][i+1]);/*输出i行i+1列字符开始的字符串*/chara[2][3],b[3][5];14二维字符数组举例例:输入英文的星期几,确定对应的数字。 可以查星期表,若发现与表中某项相同(英文的星期几),则输出该字符串在表中的位置(序号);若查到表尾仍不相同,则输出错误信息。可以建立如下星期表:SundayMondayTuesdayWednesdayThursdayFridaySaturdaySunday\0Monday\0Tuesday\0Wednesday\0Thursday\0Friday\0Saturday\0012345601234567890123456用二维字符数组存储星期表,每行存一个字符串15二维字符数组举例#include<stdio.h>intmain(){inti,k;charid[10];charw_day[][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};printf("Enterastring:");scanf("%s",id);for(i=0;i<7;i++){for(k=0;id[k]!='\0';k++){if(w_day[i][k]==id[k])continue;elsebreak;}if(id[k]=='\0')break;} if(i<7)printf("%sis%d\n",id,i); elseprintf("Error!\n");return0;}16字符串的长度字符串的长度是字符串中位于结束标识'\0'之前的所有字符的个数#include<stdio.h>intmain(){ charstr[]="abcdefg"; inti,iLength=0;

while(str[iLength]!='\0') iLength++; printf("Lengthofstring:\n"); for(i=0;i<iLength;i++) printf("%c",str[i]); printf("\nis%d\n",iLength);return0;}while(str[++iLength]!='\0')

;abcdefg\0串长length=7length=0length=1length=217字符串的输入输出对于字符串(字符数组),在程序中既可以逐个引用字符串中的单个字符(数组元素)也可以一次引用整个字符串(字符数组)(与数值型数组的区别)18对字符数组逐个元素输入/输出for(i=0;i<10;i++){ s[i]=getchar();}chars[10];for(i=0;s[i]!='\0';i++){

putchar(s[i]);}putchar('\n');19字符串I/0函数charname[10];scanf("%s",name);printf("%s",name);格式描述串中使用转换字符串"%s"WangLiWang\0使用scanf时,不能输入空格Wang20字符串示例#include<stdio.h>intmain(void){ chars1[15]; chars2[]={'A','u','d','r','e','y','\0'}; chars3[]="MichaelHolding"; intcnt=0; printf("\n请向数组中输入一个姓名:"); scanf("%s",s1); printf("\n显示字符串\n"); printf("第一个字符串是:"); while(s1[cnt]!='\0'){ printf("%c",s1[cnt]); cnt++; } printf("\n第二个字符串是:"); printf("%s",s2); printf("\n第三个字符串是:"); printf("%s\n",s3);return0;}21字符串I/0函数charname[10];gets(name);puts(name);WangLi\0WangLiWangLi从键盘上读入一个完整的行,存入字符数组name。并用空字符'\0'取代行尾的换行符'\n'。把字符数组中的字符串输出到显示器。使用gets函数允许输入空格22字符串I/0函数puts函数完全可以由printf函数取代。当需要按一定格式输出时,通常使用printf函数。printf("\n雇员姓名是:");puts(name);printf("\n雇员所属部门是:");puts(dept);printf("\n雇员姓名是:%s",name);printf("\n雇员所属部门是:%s\n",dept);使用puts函数输出字符串使用printf函数输出字符串23字符串示例#include<stdio.h>intmain(void){charline[30];inti,count=0;printf("\n请输入一行字符:\n");

gets(line);i=0;while(line[i]!='\0'){ if(line[i]=='') count++; i++;}printf("\n其中的空格总数为

%d\n",count);return0;}Cisaprogramminglanguage在循环执行时,扫描整个数组以统计出空格''的数量,直到遇到字符'\0'。每次循环执行时,都会更新计数器i和count。其中的空格总数为424字符串示例#include<stdio.h>intmain(void){ charname[30]; charaddress[30]; puts("请输入您的姓名:"); gets(name);

fflush(stdin); puts("请输入您的地址:"); gets(address);

fflush(stdin); printf("\n您的姓名和地址是:\n"); puts(name); puts(address);return0;}25scanf和gets使用注意事项scanf和gets都可以给字符数组赋值,scanf不能读入带空格的字符串,gets可以。但是scanf和gets两种用法都不安全,当用户输入的字符个数多于字符数组的维数时,数组将产生越界。scanf被公认为最易遭到黑客攻击的函数之一gets()也没有提供限制输入字符串长度的方法,容易引起缓冲区溢出,给黑客攻击以可乘之机

对输入字符串长度有限制的函数调用fgets(buf,sizeof(buf),stdin);26字符串处理函数与字符串有关的内置函数在头文件string.h中定义要使用标准库字符串处理函数,程序前应该包含:

#include<string.h>string.hstrlenstrcpystrcmpstrcat……27求字符串长度函数语法

strlen(s);描述计算字符串s中字符的个数,并将字符的个数作为函数的返回值。在计算字符个数时不计表示字符串结束的空字符'\0'。strlen#include<stdio.h>#include<string.h>intmain(void){chararr[]="Beijing";intlen1,len2;

len1=strlen(arr);len2=strlen("Shanghai");printf("\nstring=%slength=%d",arr,len1);printf("\nstring=%slength=%d\n","Shanghai",len2);return0;}string=Beijinglength=7string=Shanghailength=828字符串复制将字符串str1拷贝到串str2中。根据字符串中

\0的位置,只对\0前面的字符进行复制。 #include<stdio.h>intmain(){charstr1[100],str2[100];inti;printf("Enterstring1:");gets(str1);/*输入字符串str1*/for(i=0;(str2[i]=str1[i])!='\0';i++);/*复制*/

printf("Outputstring2:%s\n",str2);return0;}ab.........fg\0ab.........fg\0str1str2.........29字符串复制函数语法

strcpy(dest,src)描述其中,dest是目标字符串,src是源字符串。相当于把字符数组src中的字符串拷贝到字符数组dest中。结束标志'\0'也一同拷贝。src可以是一个字符串常量。字符数组dest应足够大,以保证字符串复制不越界。strcpy#include<stdio.h>#include<string.h>intmain(void){ charsource[]="Wechangelives"; chartarget[20];

strcpy(target,source); printf("\n源字符串=%s",source); printf("\n目标字符串=%s\n",target);return0;}

源字符串=Wechangelives

目标字符串=Wechangelives字符串不能直接整体复制,必须借助strcpy!30字符串比较函数语法

strcmp(str1,str2)描述 按照ASCII码顺序比较字符串str1和str2的大小,比较的结果由函数返回。在两个字符串str1和str2相同时返回0;字符串str1大于字符串str2时返回一个正值,否则就返回负值。strcmp#include<stdio.h>#include<string.h>intmain(void){ charusername[15],pwd[15]; printf("\n请输入用户名:"); gets(username); printf("\n请输入密码:"); gets(pwd); if((strcmp(username,"John")==0)&&(strcmp(pwd,"123456")==0)) printf("\n您已成功登录\n"); else printf("\n用户名和/或密码无效\n");return0;}

请输入用户名:john

请输入密码:123456

用户名和/或密码无效

请输入用户名:John

请输入密码:123456

您已成功登录字符串不能用关系运算符比较大小,必须借助strcmp!"abc"与"abc",相等"abcd"与"abck","abcd"小"abc"与"ab","abc"大31字符串函数使用示例从键盘任意输入5个学生的姓名,编程找出并输出按字典顺序排在最前面的学生姓名等价于求最小字符串32字符串函数使用示例#include<stdio.h>#include<string.h>#defineARRA_SIZE80intmain(){ intn,num; charstr[ARRA_SIZE],min[ARRA_SIZE]; printf("Pleaseenterfivenames:\n"); gets(str);

strcpy(min,str); for(n=1;n<5;n++){ gets(str); if(strcmp(str,min)<0)

strcpy(min,str);

} printf("Theminis%s:",min);return0;}33字符串连接将串str2连接到串str1之后。根据字符串中

\0的位置进行字符串连接。关键:要用str2的第1个字符覆盖str1的串结束标记\0。算法:1、查找str1的串结束标记\02、从str1的\0开始,将str2复制到str1后面。\0xy...zaabcdefg\0bcdefg\0str2str1.........34字符串连接#include<stdio.h>intmain(){

charstr1[100],str2[100];

inti,j;

printf("Enterstring1:");

gets(str1);

printf("Enterstring2:");

gets(str2);

for(i=0;str1[i]!='\0';i++);/*确定\0位置*/

for(j=0;(str1[i]=str2[j])!='\0';i++,j++);

printf("Outputstring1:%s\n",str1);return0;}35字符串连接函数语法

strcat(dest,src)描述把字符串src中的字符串连接到字符串dest中字符串的后面。本函数返回值是字符数组dest的首地址。连接后字符串的总长度将是字符串src的长度加上字符串dest的长度。目标字符串dest的大小应足够存储最终的字符串。strcat#include<stdio.h>#include<string.h>intmain(void){ charsource_string[]="UPC"; chartarget_string[30]="Hello";

strcat(target_string,source_string); printf("\n源字符串=%s",source_string); printf("\n目标字符串=%s\n",target_string);return0;}

源字符串=UPC

目标字符串=HelloUPC36字符串大写转小写函数#include<stdio.h>#include<string.h>intmain(void){ charstr1[50]; printf("\n请输入一个大写格式的字符串:\n"); gets(str1); printf("\n"); printf("原始字符串为:%s\n",str1); //用strlwr()将字符串转换为小写格式

printf("转换后的字符串为:%s\n",strlwr(str1));return0;}37字符串反向在字符串中将首尾字符进行对调 intmain

(){

charstr[100],c;inti,j;

printf("Enterstring:");gets(str);

for(i=0;str[i]!=’\0’;i++);

i--;

for(j=0;j<i;i--,j++){c=str[i];str[i]=str[j];str[j]=c;}

printf("Outputstring:%s\n",str);return0;}\0abcdefghijk\0strj=0i=10ak1j9b28cij=0,1,2,3,i=10,9,8,7,/*确定\0的位置*//*i指向\0之前的最后一个字符*//*向中间逐步交换i和j指向的字符*/算法:当j<i时,逐步交换i和j指向的字符38字符串处理函数#include<stdio.h>#include<string.h>intmain(void){ charmsg[]="FlylikeaBUTTERFLYandStringlikeaBEE"; printf("\n原始字符串为:%s\n",msg); //用strrev()将字符串进行左右反转

printf("\n左右反转后的字符串为:%s\n",strrev(msg));return0;}39总结字符串与字符数组的区别是字符串的末尾有一个空字符'\0'以标识字符串结束用scanf()语句读入字符串时不允许输入中存在空格gets()和puts()函数分别用于字符串的输入和输出在string.h中定义了很多字符串处理函数函数,比较常用的有:strcpy()、strcat()、strcmp()和strlen()假如程序里需要一组字符串,一种常用的做法就是用一个字符指针数组表示它们字符串可以作为参数,函数传递机制同数组作为参数,为引用方式【设计型】8.1字符转换描述提取一个字符串中的所有数字字符(‘0’...‘9’)将其转换为一个整数输出。输入一个以回车符为结束标志的字符串(少于80个字符)。输出把字符串中的所有数字字符(‘0’...‘9’)转换为一个整数并输出。4041#include<stdio.h>intmain(){ inti,n,t; chara[80]; gets(a); i=0; t=0; while((n=a[i])!='\0') { if((n>='0')&&(n<='9'))printf("%c",n); i++; } printf("\n"); return0;}【设计型】8.2合并字符串输入两个已经按从小到大顺序排列好的字符串,编写一个合并两个字符串的函数,使合并后的字符串,仍然是从小到大排列。输入:

两个已经排好顺序(升序)的字符串输出:

一个合并在一起的有序(升序)的字符串要求:

设计一个效率尽量高的算法,对每个字符串只扫描一遍就可以了。

如果采用先进行串连接,然后再进行排序的算法,则效率太低了。42【设计型】8.3删除重复字符背景:输入一个长度不超过100的字符串,删除串中的重复字符。输入:输入要检查的字符串,长度不超过100个字符。例如:abacaeedabcdcd。输出:删除重复字符后的字符串。例如:abced。43背景:输入一个长度不超过100的字符串,删除串中的重复字符并排序。输入:输入要检查的字符串,长度不超过100个字符。例如

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论