C语言程序设计第10章字符串配套教材高等教育出版社清华大学出版社_第1页
C语言程序设计第10章字符串配套教材高等教育出版社清华大学出版社_第2页
C语言程序设计第10章字符串配套教材高等教育出版社清华大学出版社_第3页
C语言程序设计第10章字符串配套教材高等教育出版社清华大学出版社_第4页
C语言程序设计第10章字符串配套教材高等教育出版社清华大学出版社_第5页
已阅读5页,还剩120页未读 继续免费阅读

下载本文档

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

文档简介

第10章字符串2023/2/43:1510.1用一维字符数组存放字符串10.2

使指针指向一个字符串10.3

字符串的输入和输出10.4

字符串数组10.5

用于字符串处理的函数10.6

程序举例2023/2/43:15用来存放字符数据的数组是字符数组字符数组中的一个元素存放一个字符定义字符数组的方法与定义数值型数组的方法类似10.1

用一维字符数组存放字符串2023/2/43:15charc[10];c[0]=’I’;c[1]=’’;c[2]=’a’;c[3]=’m’;c[4]=’’;c[5]=’h’;c[6]=’a’;c[7]=’p’;c[8]=’p’;c[9]=’y’;10.1用一维字符数组存放字符串Iam

happyc[0]c[1]c[2]c[3]c[4]c[5]c[6]c[7]c[8]c[9]2023/2/43:15charc[10]={’I’,’’,’a’,’m’,’’,’h’,’a’,’p’,’p’,’y’};charc[10]={’c’,’’,’p’,’r’,’o’,’g’,’r’,’a’,’m’};10.1用一维字符数组存放字符串Iam

happyc[0]c[1]c[2]c[3]c[4]c[5]c[6]c[7]c[8]c[9]cprogram\0c[0]c[1]c[2]c[3]c[4]c[5]c[6]c[7]c[8]c[9]2023/2/43:15#include<stdio.h>voidmain(){ charstr[10]={"Iamhappy"}; puts(str);}#include<stdio.h>voidmain(){ charstr[11]={"Iamhappy"}; puts(str);}2023/2/43:15以下叙述中正确的是A)语句inta[8]={0};是合法的B)语句inta[]={0};是不合法的,遗漏了数组的大小C)语句chara[2]={"A","B"};是合法的,定义了一个包含两个字符的数组语句chara[3];a="AB";是合法的,因为数组有三个字符空间的容量,可以保存两个字符参考答案:A【解析】B选项中,如给全部元素赋值,则在数组说明中,可以不给出数组元素的个数;C选项中,chara[2]={"A","B"};不合法,应为chara[2]={'A','B'};;D选项中,用字符串方式赋值比用字符逐个赋值要多占1个字节,在该选项中应为3个字节。因此A选项正确。2023/2/43:15设有如下程序段inta[8]={0};intb[]={0};charc[2]={"A","B"};chard="AB";以下叙述正确的是A)

只有a,b的定义是合法的B)a,b,c,d的定义都是合法的C)只有a,b,c的定义是合法的D)只有c的定义是合法的

参考答案:A2023/2/43:15以下选项中,没有编译错误的是A)charstr3[]={'d','e','b','u','g','\0'};B)charstr1[5]="pass",str2[6];str2=str1;C)charname[10];name="china";D)charstr4[];str4="helloworld";

参考答案:A【解析】B选项中,不能直接将字符数组名直接赋值给另一个字符数组名。C选项赋值错误,不能将一个字符串常量赋值给一个字符指针。D选项定义str4时需要定义其长度。2023/2/43:15以下叙述中正确的是A)在语句charstr[]="string!";中,数组str的大小等于字符串的长度B)语句charstr[10]="string!";和charstr[10]={"string!"};并不等价C)对于一维字符数组,不能使用字符串常量来赋初值D)对于字符串常量"string!",系统已自动在最后加入了'\0'字符,表示串结尾

参考答案:D【解析】字符串中的字符依次存储在内存中一块连续的区域内,并且把空字符'\0'自动附加到字符串的尾部作为字符串的结束标志。故字符个数为n的字符串在内存中应占(n+1)个字节。B选项中两者等价,C选项中可以使用字符串常量来给一维字符数组赋值,就像B选项中一样,A选项中数组长度比字符串长度小一个字节,字符串中包含隐含的结尾符。2023/2/43:15有以下程序#include<stdio.h>main(){chars[]={"012xy"};inti,n=0;for(i=0;s[i]!=0;i++)if(s[i]>='a'&&s[i]<='z')n++;printf("%d\n",n);}程序运行后的输出结果是A)0B)2C)3D)5参考答案:B【解析】程序首先给字符数组s[]赋值为"012xy",for循环语句的功能是遍历字符串,通过if条件语句对字符串中的小写字母计数,在符串中小写字母为2个,即n=2。因此B选项正确。2023/2/43:15有以下程序#include<stdio.h>main(){chars[]="abcde";s+=2;printf("%d\n",s[0]);}执行后的结果是A)输出字符c的ASCII码B)程序出错C)输出字符cD)输出字符a的ASCII码

参考答案:B【解析】本题重点考察数组名的概念。在C语言中,数组名类似于一个指向数组首地址的指针常量,一旦定义就不能修改其内容。所以本题中的s+=2;语句让数组名s的内容加2是错误的,编译无法通过。因此B选项正确。2023/2/43:15若有以下程序#include<stdio.h>main(){inti,j=0;chara[]="Howareyou!";for(i=0;a[i];i++)if(a[i]!='')a[j++]=a[i];a[j]='\0';printf("%s\n",a);}则程序的输出结果是A)Hay!B)HowareyouC)Howareyou!D)Howareyou!

参考答案:C【解析】主函数中首先定义字符数组a[]="Howareyou!";执行for循环语句,语句if(a[i]!='')a[j++]=a[i];其功能是将字符数组中的空格去掉。因此C选项正确。2023/2/43:15例10.1输出一个已知的字符串。解题思路:定义一个字符数组,并用“初始化列表”对其赋以初值用循环逐个输出此字符数组中的字符10.1用一维字符数组存放字符串2023/2/43:15#include<stdio.h>intmain(){charc[15]={'I','','a','m','','a','','s','t','u','d','e','n','t','.'};inti;for(i=0;i<15;i++)printf("%c",c[i]);printf("\n");return0;}10.1用一维字符数组存放字符串2023/2/43:15在C语言中,是将字符串作为字符数组来处理的关心的是字符串的有效长度而不是字符数组的长度为了测定字符串的实际长度,C语言规定了字符串结束标志’\0’10.1用一维字符数组存放字符串2023/2/43:15’\0’代表ASCII码为0的字符从ASCII码表可以查到,ASCII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不做用它作为字符串结束标志不会产生附加的操作或增加有效字符,只是一个供辨别的标志10.1用一维字符数组存放字符串2023/2/43:15charc[]={”Iamhappy”};可写成charc[]=”Iamhappy”;相当于charc[11]={”Iamhappy”};10.1用一维字符数组存放字符串2023/2/43:15charc[10]={”China”};可写成charc[10]=”China”;从c[5]开始,元素值均为\0只显示printf(”%s”,c);10.1用一维字符数组存放字符串China\0\0\0\0\02023/2/43:15设有以下定义chars1[]="0123";chars2[]={'0','1','2','3'};则以下叙述正确的是A)

数组s1的长度大于s2的长度B)数组s1和s2的长度相同C)数组s1的长度小于s2的长度D)数组s1和s2完全等价参考答案:A【解析】在对数组进行初始化时应该注意,如果对数组的全部元素赋以初值,定义时可以不指定数组长度。为字符数组s1赋值字符串"0123"时,将字符串中字符依次放入数组中,然后在最后一个字符后添加一个结束字符'\0',所以数组s1长度为5。而数组s2根据初始化规则,只需要4个单元即可放下所有初始化值,故数组长度为4。所以数组s1的长度大于s2的长度,A选项正确。两个数组等价是指两个数组长度和类型以及对应每个元素值均相同,所以s1和s2不是完全等价,D选项错误。2023/2/43:15以下叙述中正确的是A)字符串常量"str1"的类型是:字符串数据类型B)有定义语句:charstr1[]="str1";,数组str1将包含4个元素C)下面的语句用赋初值方式来定义字符串,其中,'\0'是必须的

charstr1[]={'s','t','r','1','\0'};字符数组的每个元素可存放一个字符,并且最后一个元素必须是'\0'字符参考答案:C【解析】本题考查字符数组的相关操作,B选项中数组str1包含了5个元素,其中有结尾符,A选项中str1的类型不是字符串类型,字符数组的最后一个元素可以不是'\0'字符2023/2/43:1510.2使指针指向一个字符串字符串是存放在字符数组中的。引用一个字符串,可以用以下两种方法。(1)用字符数组存放一个字符串,可以通过数组名和格式声明“%s”输出该字符串,也可以通过数组名和下标引用字符串中一个字符。(2)用字符指针变量指向一个字符串常量,通过字符指针变量引用字符串常量。2023/2/43:15

例10.2定义一个字符数组,在其中存放字符串“IloveChina!”,输出该字符串和第8个字符。解题思路:定义字符数组string,对它初始化,由于在初始化时字符的个数是确定的,因此可不必指定数组的长度。用数组名string和输出格式%s可以输出整个字符串。用数组名和下标可以引用任一数组元素。2023/2/43:15#include<stdio.h>intmain(){charstring[]=“IloveChina!”;printf(“%s\n”,string);printf(“%c\n”,string[7]);return0;}stringstring+72023/2/43:15

例10.3通过字符指针变量输出一个字符串。

解题思路:可以不定义字符数组,只定义一个字符指针变量,用它指向字符串常量中的字符。通过字符指针变量输出该字符串。2023/2/43:15#include<stdio.h>intmain(){char*string=“IloveChina!”;printf(“%s\n”,string);return0;}stringchar*string;string=”IloveChina!”;2023/2/43:15#include<stdio.h>intmain(){char*string=“IloveChina!”;printf(“%s\n”,string);

string=”Iamastudent.”;printf(“%s\n”,string);return0;}string2023/2/43:15#include<stdio.h>intmain(){char*string=“IloveChina!”;printf(“%s\n”,string);

string=”Iamastudent.”;printf(“%s\n”,string);return0;}string2023/2/43:15

例10.4将字符串a复制为字符串b,然后输出字符串b。解题思路:定义两个字符数组a和b,用“Iamastudent.”对a数组初始化。将a数组中的字符逐个复制到b数组中。可以用不同的方法引用并输出字符数组元素,今用地址法算出各元素的值。2023/2/43:15#include<stdio.h>intmain(){chara[]=“Iamastudent.”,b[20];inti;for(i=0;*(a+i)!='\0';i++)*(b+i)=*(a+i);

*(b+i)=‘\0’;printf(“stringais:%s\n”,a);printf("stringbis:");for(i=0;b[i]!='\0';i++)printf(“%c”,b[i]);printf("\n");return0;}printf("stringbis:%s\n“,b);2023/2/43:15例10.5用指针变量来处理例10.4问题。解题思路:定义两个指针变量p1和p2,分别指向字符数组a和b。改变指针变量p1和p2的值,使它们顺序指向数组中的各元素,进行对应元素的复制。2023/2/43:15#include<stdio.h>intmain(){chara[]="Iamaboy.",b[20],*p1,*p2;p1=a;p2=b;for(;*p1!=‘\0’;p1++,p2++)*p2=*p1;

*p2=‘\0’;printf(“stringais:%s\n”,a);printf(“stringbis:%s\n”,b);return0;}2023/2/43:152023/2/43:15改为:char*cp,str[10];cp=str;scanf(“%s”,cp);()例charstr[10];scanf(“%s”,str);()

而char*cp;scanf(“%s”,cp);()现定义char*cp;与charstr[20];则str由若干元素组成,每个元素放一个字符;而cp中存放字符串首地址。对于定义charstr[20];以后,再进行str=“IloveChina!”;这样的赋值操作就是错误的。但如果是定义char*cp;而后在进行cp=“IloveChina!”;的赋值操作就是正确的。因为str是地址常量,不可以被赋值;cp是地址变量,可以被赋值。**注意cp接受键入字符串时,必须先开辟存储空间,如图所示。10.2使指针指向一个字符串如果想把一个字符串从一个函数“传递”到另一个函数,可以用地址传递的办法,即用字符数组名作参数,也可以用字符指针变量作参数。在被调用的函数中可以改变字符串的内容在主调函数中可以引用改变后的字符串。2023/2/43:1510.2使指针指向一个字符串例10.6用函数调用实现字符串的复制。解题思路:定义一个函数copy_string用来实现字符串复制的功能,在主函数中调用此函数,函数的形参和实参可以分别用字符数组名或字符指针变量。分别编程,以供分析比较。2023/2/43:15(1)用字符数组名作为函数参数#include<stdio.h>intmain(){voidcopy_string(charfrom[],charto[]);chara[]="Iamateacher.";charb[]="youareastudent.";printf(“a=%s\nb=%s\n",a,b);printf("copystringatostringb:\n");copy_string(a,b);printf(“a=%s\nb=%s\n",a,b);return0;}2023/2/43:15voidcopy_string(charfrom[],charto[])

{inti=0;while(from[i]!='\0'){to[i]=from[i];i++;}to[i]='\0';}2023/2/43:15(2)用字符型指针变量作实参copy_string不变,在main函数中定义字符指针变量from和to,分别指向两个字符数组a,b。仅需要修改主函数代码2023/2/43:15#include<stdio.h>intmain(){voidcopy_string(charfrom[],charto[]);chara[]=“Iamateacher.”;charb[]=“youareastudent.”;char*from=a,*to=b;

printf(“a=%s\nb=%s\n",a,b);printf("\ncopystringatostringb:\n");copy_string(from,to);printf(“a=%s\nb=%s\n",a,b);return0;}2023/2/43:15(3)用字符指针变量作形参和实参2023/2/43:15#include<stdio.h>intmain(){voidcopy_string(char*from,char*to);char*a=“Iamateacher.”;charb[]=“Youareastudent.”;char*p=b;printf(“a=%s\nb=%s\n”,a,b);printf("\ncopystringatostringb:\n");copy_string(a,p);printf(“a=%s\nb=%s\n”,a,b);return0;}2023/2/43:15voidcopy_string(char*from,char*to){for(;*from!='\0';from++,to++){*to=*from;}*to='\0';}函数体有多种简化写法,请见主教材

2023/2/43:15使用字符指针变量和字符数组的比较用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈,主要有以下几点。(1)字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第1个字符的地址),决不是将字符串放到字符指针变量中。2023/2/43:15使用字符指针变量和字符数组的比较用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈,主要有以下几点。(2)赋值方式。可以对字符指针变量赋值,但不能对数组名赋值。char*a;a=”IloveChina!”;对charstr[14];str[0]=’I’;对charstr[14];str=”IloveChina!”;错2023/2/43:15使用字符指针变量和字符数组的比较用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈,主要有以下几点。(3)初始化的含义char*a=”IloveChina!”;与char*a;a=”IloveChina!”;等价2023/2/43:15使用字符指针变量和字符数组的比较用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈,主要有以下几点。(3)初始化的含义charstr[14]=”IloveChina!”;与charstr[14];str[]=”IloveChina!”;不等价2023/2/43:15使用字符指针变量和字符数组的比较用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈,主要有以下几点。(4)存储单元的内容

编译时为字符数组分配若干存储单元,以存放各元素的值,而对字符指针变量,只分配一个存储单元2023/2/43:15使用字符指针变量和字符数组的比较用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈,主要有以下几点。(4)存储单元的内容char*a;scnaf(“%s”,a);错

char*a,str[10];a=str;scanf(“%s”,a);对2023/2/43:15使用字符指针变量和字符数组的比较用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈,主要有以下几点。(5)指针变量的值是可以改变的,而数组名代表一个固定的值(数组首元素的地址),不能改变。2023/2/43:15例10.7改变指针变量的值。#include<stdio.h>intmain(){char*a="IloveChina!";a=a+7;printf(“%s\n”,a);return0;}不能改为chara[]=“IloveChina!”;2023/2/43:15使用字符指针变量和字符数组的比较用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈,主要有以下几点。(6)字符数组中各元素的值是可以改变的,但字符指针变量指向的字符串常量中的内容是不可以被取代的。chara[]=”House”,*b=”House”;a[2]=’r’;对2023/2/43:15使用字符指针变量和字符数组的比较用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈,主要有以下几点。(6)字符数组中各元素的值是可以改变的,但字符指针变量指向的字符串常量中的内容是不可以被取代的。chara[]=”House”,*b=”House”;b[2]=’r’;错2023/2/43:15使用字符指针变量和字符数组的比较用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈,主要有以下几点。(7)引用数组元数

对字符数组可以用下标法和地址法引用数组元素(a[5],*(a+5))。如果字符指针变量p=a,则也可以用指针变量带下标的形式和地址法引用(p[5],*(p+5))。2023/2/43:15使用字符指针变量和字符数组的比较用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈,主要有以下几点。char*a=″IloveChina!″;则a[5]的值是第6个字符,即字母’e’2023/2/43:15使用字符指针变量和字符数组的比较用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈,主要有以下几点。(8)用指针变量指向一个格式字符串,可以用它代替printf函数中的格式字符串。2023/2/43:15使用字符指针变量和字符数组的比较用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈,主要有以下几点。char*format;format=”a=%d,b=%f\n”;printf(format,a,b);相当于printf(“a=%d,b=%f\n”,a,b);2023/2/43:15有下列函数, voidfun(char*a,char*b) {while((*b=*a)!='\0') {a++;b++;}}其功能是()

A

将a所指字符串赋给b所指空间 B使指针b指向a所指字符串 C将a所指字符串和b所指字符串进行比较 D检查a和b所指字符串中是否有'\0' 参考答案:A【解析】While循环条件为:(*b=*a)!='\0',执行时先把指针a所指向的字符赋给指针b所在内存单元,如果该字符不是结束标识"\0",执行循环体a++;b++;,指针a、b分别指向下一个字符单元。再判断循环条件,如果成立,继续把指针a所指向的字符赋给指针b所在内存单元,直到遇到结束标识为止。因此A选项正确。2023/2/43:15有以下函数: intfun(char*s) {char*t=s; while(*t++); return(t-s);}该函数的功能是()

A计算s所指字符串的长度 B比较两个字符串的大小 C计算s所指字符串占用内存字节的个数 D将s所指字符串复制到字符串t中 参考答案:A【解析】首先char*s接受一个字符型数组的首地址并将这个首地址赋给另一个字符型指针char*t,while(*t++)不断循环直到*t为'\0',再将

t+1,这时字符指针t指向字符串的最后一个字符,又因为s指向字符数组的首地址即字符串的首地址所以

return(t-s)便是返回字符数组中字符串的长度。2023/2/43:15有以下程序 #include<stdio.h> charfun(char*c) {if(*c<='Z'&&*c>='A') *c-='A'-'a'; return*c;}

若运行时从键盘上输入OPENTHEDOOR<回车>,程序的输出结果是() AOPENTHEDOOR BoPENtHEdOOR

Copenthedoor DOpenTheDoor

参考答案:C【解析】字符串输入函数gets的功能是从标准输入设备键盘上输入一个字符串。首先使指针变量p指向字符串的首字母,while循环语句中对字符串的每个字符进行fun函数操作。fun函数的功能是,将字符串中的大写字母变小写字母。将处理结果返回主函数,主函数通过putchar()字符输出函数进行输出。因此C选项正确。 main() {chars[81],*p=s; gets(s); while(*p) {*p=fun(p); putchar(*p); p++;} printf("\n");}2023/2/43:15字符数组的输入输出可以有两种方法:

逐个字符输入输出(%c)

整个字符串一次输入输出(%s)输出的字符中不包括结束符’\0’用%s输出字符串时,printf函数中的输出项是字符数组名,不是数组元素名10.3字符串的输入输出2023/2/43:15如果一个字符数组中包含多个’\0’,则遇第一个’\0’时输出就结束可以用scanf函数输入一个字符串scanf函数中的输入项c是已定义的字符数组名,输入的字符串应短于已定义的字符数组的长度10.3字符串的输入输出2023/2/43:15charc[6];scanf(”%s”,c);China↙系统自动在China后面加一个’\0’10.3字符串的输入输出2023/2/43:15charstr1[5],str2[5],str3[5];scanf(”%s%s%s”,str1,str2,str3);Howareyou?↙10.3字符串的输入输出How\0\0str1are\0\0str2you?\0str32023/2/43:15有如下程序#include<stdio.h>main(){charname[10]={'S','T','R','I','N','G'};name[3]='E';name[5]=0;printf("%s\n",name);}程序运行后的输出结果是A)STRENB)STRIEGC)STRENGD)STREN0

参考答案:A【解析】printf函数按照格式符说明输出对应的数据。%s控制符用于输出字符串,输出时从给定地址开始依次输出字符,直到遇到'\0'结束。给字符变量赋值0,相当于赋值'\0'。初始化时name="STRING",改动数组第4个和第6个元素之后字符串变为"STREN"。调用printf输出字符串为STREN,A选项正确。2023/2/43:15在C函数库中提供了一些用来专门处理字符串的函数,使用方便10.3字符串的输入输出2023/2/43:151.puts函数----输出字符串的函数其一般形式为:puts(字符数组)作用是将一个字符串输出到终端charstr[20]=”China”;puts(str);

输出China10.3字符串的输入输出2023/2/43:15若有以下程序

charw[20],a[5][10]={"abcdef","ghijkl","mnopq","rstuv","wxyz"};intp[6][2]={{0,1},{1,5},{0,0},{0,2},{1,4},{4,4}},i;for(i=0;i<6;i++)w[i]=a[p[i][0]][p[i][1]];puts(w);

则程序的输出结果是A)catisB)ababjC)ckbdlD)black

参考答案:D【解析】程序首先初始化字符数组a[5][10]和二维数组p[6][2]。执行for循环语句,循环变量i从0取值到5,得到字符数组w[]的值,并通过字符串输出函数puts进行输出操作。w[0]=a[0][1]、w[1]=a[1][5]、w[2]=a[0][0]、w[3]=a[0][2]、w[4]=a[1][4]、w[5]=a[4][4];因此最后字符数组w的结果为black。因此D选项正确。2023/2/43:15有以下程序#include<stdio.h>main(){chara[5][10]={"one","two","three","four","five"};inti,j;chart;for(i=0;i<2;i++)for(j=i+1;j<5;j++)if(a[i][0]>a[j][0]){

t=a[i][0];a[i][0]=a[j][0];a[j][0]=t;}puts(a[1]);}

程序运行后的输出结果是A)owoB)

fwoC)twoD)fix参考答案:B【解析】考查二维数组元素的引用。当i为0时,代码处理结果为第一个字符串的第一个字符与第四个字符串的第一个字符调换,当i为1时,代码处理结果为第而个字符串的第一个字符与第五个字符串的第一个字符调换,所以a[1]为fwo2023/2/43:152.gets函数----输入字符串的函数其一般形式为:gets(字符数组)作用是输入一个字符串到字符数组charstr[20];gets(str);

Computer↙10.3字符串的输入输出2023/2/43:15若有以下程序

{chara[20],b[]="Theskyisblue.";inti;for(i=0;i<7;i++)scanf("%c",&b[i]);gets(a);printf("%s%s\n",a,b);}执行时若输入:(其中<Enter>表示回车符)Figflowerisred.<Enter>则输出结果是A)werisred.Figfloisblue.B)werisred.FigfloC)werisred.Theskyisblue.Figflowerisred.Theskyisblue.

参考答案:A【解析】程序首先初始化字符数组b[],执行for循环语句,循环变量i的取值范围从0到6。在for循环语句中通过scanf函数将从键盘上输入的数据输入到b[]中,即b的值为Figfloisblue.。退出for循环语句,执行语句gets(a);,gets()函数的调用形式为:gets(str_adr),其中str_adr是存放输入字符串的起始地址,可以是字符数组名、字符数组元素的地址或字符指针变量。gets函数用来从终端键盘读入字符串(包括空格符),直到读入一个换行符为止,即a的值为werisred.。因此A选项正确。2023/2/43:153.strcat函数----字符串连接函数其一般形式为:strcat(字符数组1,字符数组2)其作用是把两个字符串连接起来,把字符串2接到字符串1的后面,结果放在字符数组1中10.3字符串的输入输出使用字符串函数时,在程序开头用#include<string.h>2023/2/43:15chardiamond[5][5]={{’’,’’,’*’},{’’,’*’,’’,’*’},{’*’,’’,’’,’’,’*’},{’’,’*’,’’,’*’},{’’,’’,’*’}};10.4字符串数组2023/2/43:15例10.8输出一个菱形图。解题思路:定义一个字符型的二维数组,用“初始化列表”进行初始化用嵌套的for循环输出字符数组中的所有元素。10.4字符串数组2023/2/43:15#include<stdio.h>intmain(){chardiamond[][5]={{'','','*'},{'','*','','*'},{'*','','','','*'},{'','*','','*'},{'','','*'}};inti,j;for(i=0;i<5;i++){for(j=0;j<5;j++)printf("%c",diamond[i][j]);printf("\n");}return0;}2023/2/43:15以下叙述中正确的是A)字符串数组,是指数组中的每个元素都是一个存放字符串的一维数组B)charca[3][5]={"A","BB","CCC"};是不合语法的C)charca[][5]={"A","BB","CCC"};是不合语法的D)char*ca[3]={"A","BB","CCC"};是不合语法的

参考答案:A【解析】本题考查字符串数组的相关知识,选项B、C、D都是合语法的。2023/2/43:151.strcat函数----字符串连接函数charstr1[30]=”People”;charstr2[]=”China”;printf(”%s”,strcat(str1,str2));

输出:PeopleChina10.5用于字符串处理的函数要足够大2023/2/43:152.strcpy和strncpy函数-字符串复制strcpy一般形式为:strcpy(字符数组1,字符串2)作用是将字符串2复制到字符数组1中去charstr1[10],str2[]=”China”;strcpy(str1,str2);10.5用于字符串处理的函数China\0\0\0\0\0str12023/2/43:15有以下程序(strcat函数用以连接两个字符串)#include<stdio.h>#include<string.h>main(){chara[20]="ABCD\0EFG\0",b[]="IJK";strcat(a,b);printf("%s\n",a);}程序运行后的输出结果是A)IJKB)ABCDE\0FG\0IJKC)ABCDIJKD)EFGIJK参考答案:C【解析】字符数组a中包含两个'\0',遇到第一个'\0'时就表示字符串a结束。字符串处理函数strcat(字符数组a,字符数组b),功能是连接两个字符数组中的字符串,把字符串b连接到a的后面,结果放在字符数组a中。连接时将字符串a后的'\0'取消,只在新串最后保留一个'\0'。本题相当于将"ABCD"和"IJK"连接。因此C选项正确。2023/2/43:152.strcpy和strncpy函数-字符串复制strcpy一般形式为:strcpy(字符数组1,字符串2)作用是将字符串2复制到字符数组1中去charstr1[10],str2[]=”China”;strcpy(str1,str2);10.5用于字符串处理的函数China\0\0\0\0\0str1要足够大2023/2/43:152.strcpy和strncpy函数-字符串复制strcpy一般形式为:strcpy(字符数组1,字符串2)作用是将字符串2复制到字符数组1中去charstr1[10],str2[]=”China”;strcpy(str1,str2);10.5用于字符串处理的函数数组名形式2023/2/43:152.strcpy和strncpy函数-字符串复制strcpy一般形式为:strcpy(字符数组1,字符串2)作用是将字符串2复制到字符数组1中去charstr1[10],str2[]=”China”;strcpy(str1,str2);10.5用于字符串处理的函数数组名或字符串常量2023/2/43:152.strcpy和strncpy函数-字符串复制strcpy一般形式为:strcpy(字符数组1,字符串2)作用是将字符串2复制到字符数组1中去charstr1[10],str2[]=”China”;strcpy(str1,str2);相当于strcpy(str1,”China”);10.5用于字符串处理的函数2023/2/43:152.strcpy和strncpy函数-字符串复制charstr1[10],str2[]=”China”;str1=”China”;错误str1=str2;错误10.5用于字符串处理的函数2023/2/43:152.strcpy和strncpy函数-字符串复制可以用strncpy函数将字符串2中前面n个字符复制到字符数组1中去strncpy(str1,str2,2);作用是将str2中最前面2个字符复制到str1中,取代str1中原有的最前面2个字符复制的字符个数n不应多于str1中原有的字符10.5用于字符串处理的函数2023/2/43:153.strcmp函数----字符串比较函数其一般形式为strcmp(字符串1,字符串2)作用是比较字符串1和字符串2strcmp(str1,str2);strcmp(”China”,”Korea”);strcmp(str1,”Beijing”);10.5用于字符串处理的函数2023/2/43:153.strcmp函数----字符串比较函数字符串比较的规则是:将两个字符串自左至右逐个字符相比,直到出现不同的字符或遇到’\0’为止如全部字符相同,认为两个字符串相等若出现不相同的字符,则以第一对不相同的字符的比较结果为准10.5用于字符串处理的函数2023/2/43:153.strcmp函数----字符串比较函数”A”<”B””a”>”A””computer”>”compare””these”>”that””1A”>”$20””CHINA”>”CANADA””DOG”<”cat””Tsinghua”>”TSINGHUA”10.5用于字符串处理的函数2023/2/43:153.strcmp函数----字符串比较函数比较的结果由函数值带回如果字符串1=字符串2,则函数值为0如果字符串1>字符串2,则函数值为一个正整数如果字符串1<字符串2,则函数值为一个负整数10.5用于字符串处理的函数2023/2/43:153.strcmp函数----字符串比较函数if(str1>str2)printf(”yes”);错误if(strcmp(str1,str2)>0)printf(”yes”);正确10.5用于字符串处理的函数2023/2/43:154.strlen函数----测字符串长度的函数其一般形式为:strlen(字符数组)它是测试字符串长度的函数函数的值为字符串中的实际长度10.5用于字符串处理的函数2023/2/43:154.strlen函数----测字符串长度的函数charstr[10]=”China”;printf(”%d”,strlen(str));输出结果是5也可以直接测试字符串常量的长度strlen(”China”);10.5用于字符串处理的函数2023/2/43:15若有定义语句:chars[10]="1234567\0\0";则strlen(s)的值是A)7B)8C)910

参考答案:A【解析】strlen()函数:是计算字符串长度时,遇到结束标识为止,且长度不包括结束标识。本题中字符串,从第一个字符开始,遇到第一个结束标识'\0'为止,注意'\0'不占字符串长度,所以字符串长度为7。因此A选项正确。2023/2/43:15有以下程序#include<stdio.h>#include<string.h>

main(){charstr[12]={'s','t','r','i','n','g'};printf("%d\n",strlen(str));}程序运行后的输出结果是A)6B)7C)11D)12

参考答案:A【解析】数组初始化时,如果在说明数组时给出了长度,但没有给所有的元素赋予初始值,而只依次给前面的几个数组元素赋予初值,那么C语言将自动对余下的元素赋初值,如果为字符数组,自动赋值"\0",即str[12]={'s','t','r','i','n','g',"\0","\0","\0","\0","\0","\0"}。strlen函数求字符串长度,统计长度时以"\0"结束,即统计到长度为6时结束,strlen函数返回值为6,A选项正确。2023/2/43:15若有定义语句:charstr1[]="string",str2[8],*str3,str4[10]="string";,库函数strcpy的功能是复制字符串,以下选项中错误的函数调用是()

Astrcpy(str3,"HELLO!")

Bstrcpy(str2,"HELLO!") Cstrcpy(str1,"HELLO!") Dstrcpy(str4,"HELLO!")

参考答案:A【解析】题目中字符指针str3,没有为指针开辟内存,能作为函数参数,选择A选项。2023/2/43:155.strlwr函数----转换为小写的函数其一般形式为strlwr(字符串)函数的作用是将字符串中大写字母换成小写字母10.5用于字符串处理的函数2023/2/43:156.strupr函数----转换为大写的函数其一般形式为strupr(字符串)函数的作用是将字符串中小写字母换成大写字母10.5用于字符串处理的函数2023/2/43:15有以下程序#include<stdio.h>#include<string.h>main(){charp[20]={'a','b','c','d'},q[]="abc",r[]="abcde";strcat(p,r);strcpy(p+strlen(q),q);printf("%d\n",strlen(p));}程序运行后的输出结果是A)11

B)9C)

6

D)7

参考答案:C【解析】strcpy:字符串拷贝函数;strlen:求字符串长度函数(注意:不包含字符串结束标记字符'\0');strcat:字符串连接函数。执行完语句strcat(p,r);后,p数组中存储的元素为a,b,c,d,a,b,c,d,e;执行语句strcpy(p+strlen(q),q);得到的结果是将q所指向的字符串拷贝至p+strlen(q)开始的存储位置,因为strlen的值为3,即p+3开始存储q中的元素。所以执行完strcpy(p+strlen(q),q)语句后,字符数组p[20]的存储元素为a,b,c,a,b,c;所以strlen(p)的结果为6。因此C选项正确。2023/2/43:15若有说明和语句:charstr[]="Hello",*p;p=str;,则此时*(p+5)中的值为()

A'\0' B'o' C'o'的地址 D不确定的值

参考答案:A【解析】定义字符数组并为其初始化,str数组前5个元素为Hello,第六个元素自动赋值为"\0"。定义指针使等于字符串首地址,p+5指向字符串第六个元素。A选项正确。2023/2/43:15若有以下程序段 charstr[4][12]={"aa","bbb","ccccc","d"},*strp[4]; inti; for(i=0;i<4;i++)strp[i]=str[i];不能正确引用字符串的选项是() Astr[0] Bstrp Cstrp[3] D*strp

参考答案:B【解析】本题考查字符串指针作为函数参数,本题中p作为字符串指针传入fun中,p指向的内容并没有发生变化,所以选项B正确。2023/2/43:15设有如下程序段 #include<stdio.h> chars[20]="Beijing",*p; p=s;则执行p=s;语句后,以下叙述正确的是() As和p都是指针变量 Bs数组中元素的个数和p所指字符串长度相等

C可以用*p表示s[0]

D数组s中的内容和指针变量p中的内容相同

参考答案:C【解析】程序定义了字符数组s和字符型指针变量p,并且使得p指向数组,执行p=s;语句后,*p即表示s[0];s数组中元素的个数和p所指字符串长度不相等,因为s数组中元素的个数包括字符串结束标志"\0",而p所指字符串长度不包括"\0";s是字符型数组,p是指针变量;数组s中的内容和指针变量p中的内容不相同,数组中存放的是字符串,而指针变量p存放的是数组的首地址。因此C选项正确。2023/2/43:15有以下程序 #include<stdio.h> #include<string.h> voidfun(char*w,intm) {chars,*p1,*p2; p1=w;p2=w+m-1; while(p1<p2) {s=*p1;*p1=*p2;*p2=s; p1++;p2--;} } main() {chara[]="123456"; fun(a,strlen(a)); puts(a);}程序运行后的输出结果是() A123456 B116611 C161616 D654321

参考答案:D【解析】主函数中调用fun(a,6)后,指针p1指向字符串中的"1"、p2指向字符串中的"6"。While循环中,只要p1<p2,则把p1、p2所指向的字符互换,同时p1前移,p2后移。最终字符串逆序存放。因此D选项正确。2023/2/43:15有以下程序(说明:字母A的ASCII码值是65) #include<stdio.h> voidfun(char*s) {while(*s) {if(*s%2)printf("%c",*s); s++; } } main() {chara[]="BYTE"; fun(a); printf("\n");}程序运行后的输出结果是() ABT BYE CYT DBY

参考答案:B【解析】本题中执行funA时,会取a的第一个字母B,因为B的ASCII码为66,所以不会输出B,函数只会输出ASCII码为奇数的字母,Y的ASCII码为89,T的ASCII码为84,E的ASCII码为69。因此B选项正确。2023/2/43:15有以下程序 #include<stdio.h> intfun(chars[]) {intn=0; while(*s<='9'&&*s>='0'){n=10*n+*s-'0';s++;} return(n);} main() {chars[10]={'6','1','*','4','*','9','*','0','*'}; printf("%d\n",fun(s));}程序的运行结果是() A5 B9

C61 D61490 参考答案:C【解析】在fun函数中,while循环的功能是:逐个取字符数组s的字符判断其是否是数字。若是则将其作为个位数字保存到变量n中,n的原数据的各个数位将相应左移一个10进制位。当指针s指向数组的第3位时,循环条件不成立,循环结束,返回n的值,输出n的值为61。因此C选项正确。2023/2/43:15有如下程序 #include<stdio.h> intdisp(char*str) {while(*str)putchar(*str++); return*str;} main() {printf("%d\n",disp("NAME"));}程序运行后的输出结果是()

ANAME0 BNAMEE CNAME DNAME\0

参考答案:A【解析】程序执行过程为:调用函数disp,将字符串"NAME"首地址传给指针str,在while循环中,依次判断字符串中字符是否为'\0',不是'\0'则输出字符,否则结束循环。当(*str)='\0'时,结束循环,返回字符'\0'的ASCII码0,并输出。程序运行后的输出结果是:NAME0,A选项正确。2023/2/43:15有以下程序 #include<stdio.h> main() {charc[2][5]={"6934","8254"},*p[2]; inti,j,s=0; for(i=0;i<2;i++)p[i]=c[i]; for(i=0;i<2;i++) for(j=0;p[i][j]>0&&p[i][j]<='9';j+=2) s=10*s+p[i][j]-'0'; printf("%d\n",s);}程序的输出结果是() A693825 B69825 C63825 D6385 参考答案:D【解析】本题的意图在于将c中两个字符串的偶数位置的数字组成一个新数,找到的四个数字分别为6、3、8、5,组成的数为6385,所以答案为D选项。2023/2/43:15有以下程序 #include<stdio.h> voidfun1(char*p) {char*q; q=p; while(*q!='\0') {(*q)++; q++;} } main() {chara[]={"Program"},*p; p=&a[3]; fun1(p); printf("%s\n",a);}程序执行后的输出结果是() APrphsbn BProhsbn CProgsbn DProgram

参考答案:B【解析】(*q)++是q所指的字符加1,q++就是指针移到下一个字符。因此B选项正确。2023/2/43:15有如下程序 #include<stdio.h> main() {inti,*ptr; intarray[5]={5,3,1}; for(ptr=array,i=0;i<5;i++,ptr++) {if(*ptr==0)putchar('X');

elseputchar('A'+*ptr);} printf("\n");}程序运行后的输出结果是()

AFDBXX BFFFXX CFDBBB DABCDE 参考答案:A【解析】array={5,3,1,0,0}。程序执行过程为:执行for循环,将数组首地址赋给指针ptr,依次遍历每一个元素,如果数组元素为0则输出'X',如果不为0则按照字母表输出字符'A'后第array[i]个字符。程序运行后的输出结果为:FDBXX,A选项正确。2023/2/43:15以下不能将键盘输入的字符串:Thisisastring<回车>读入到str中的程序段是()A

charstr[80];scanf("%s",str);Bcharstr[80];inti=0;while((str[i++]=getchar())!='\n');str[i]=0;Ccharstr[80];gets(str);Dcharstr[80],*ps=str;do{scanf("%c",ps);}while(*ps++!='\n');*(ps)=0;

参考答案:A【解析】在使用scanf函数时要注意,在输入数据时,遇到空格,或按"回车"键或按"跳格"(Tab)键时该数据认为结束。A选项中输入This后有一个空格,认为数据输入结束,以后的数据不能再读入到str中,故选择A选项。B选项用getchar读入字符,键盘输入的所有字符均被认为是有效字符读入,用while循环控制读入,当读入字符为回车时结束读入,字符串被正确的读入到str中。C选项用gets函数读入字符串,它读入键盘输入的所有字符,遇到回车自动结束读入,所以也能正确读入字符串到str中。D选项用do…while和指针循环控制字符输入,依次判断输入字符是否为回车,若不是回车放入字符数组中,直到读入回车符,结束循环,数组str中正确存放入指定的字符串。2023/2/43:15以下不能将s所指字符串正确复制到t所指存储空间的是()

Ado{*t++=*s++;}while(*s); Bfor(i=0;t[i]=s[i];i++); Cwhile(*t=*s){t++;s++} Dfor(i=0,j=0;t[i++]=s[j++];);

参考答案:A【解析】do{*t++=*s++;}while(*s);不能因为当*s='\0'时,while(*s)跳出循环,这样字符串结束标志'\0'没有复制给*t,造成*t不完整。注意,*t++=*s++是先执行t=*s,然后才进行t=t+1,s=s+1。B,C,D都能将'\0'复制过去。2023/2/43:15设有定义语句: char*aa[2]={"abcd","ABCD"};则以下叙述正确的是()

Aaa[0]存放了

温馨提示

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

评论

0/150

提交评论