C语言各章节单元测试题及答案字符串Word下载.docx

上传人:b****6 文档编号:18663313 上传时间:2022-12-31 格式:DOCX 页数:20 大小:24.19KB
下载 相关 举报
C语言各章节单元测试题及答案字符串Word下载.docx_第1页
第1页 / 共20页
C语言各章节单元测试题及答案字符串Word下载.docx_第2页
第2页 / 共20页
C语言各章节单元测试题及答案字符串Word下载.docx_第3页
第3页 / 共20页
C语言各章节单元测试题及答案字符串Word下载.docx_第4页
第4页 / 共20页
C语言各章节单元测试题及答案字符串Word下载.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

C语言各章节单元测试题及答案字符串Word下载.docx

《C语言各章节单元测试题及答案字符串Word下载.docx》由会员分享,可在线阅读,更多相关《C语言各章节单元测试题及答案字符串Word下载.docx(20页珍藏版)》请在冰豆网上搜索。

C语言各章节单元测试题及答案字符串Word下载.docx

对字符型数组不能用“=”整体赋值,chars[]=”Hello”;

这种形式称为“初始化”而不叫赋值语句。

C

【例4】对于以下字符串,说明表达式strlen(s)的值。

1.chars[10]={‘a’,’\0’,’b’,’c’,’d’,’\0’};

_______

A)10B)1C)6D)4

2.chars[]=”\\141\141abc\t”;

A)9B)12C)13D)14

3.char*s=”\x69\082\n”;

_________

A)3B)5C)1D)字符串中有非法字符

本例考查strlen函数及字符串结束符和转义字符的用法。

因为字符串遇到第一个’\0’即终止,不管第一个’\0’后面还有多少字符,都认为字符串已经终止,所以第一题中的串长为1(注意串长不包括’\0’)。

因为转义字符作为一个字符处理,所以第二题中’\\’是一个字符,’\141’是一个字符,’\t’是一个字符,所以串长为9。

第三题的第一个字符是十六进制转义字符,’\082’容易被误认为是八进制转义字符,但是注意,8超过了八进制的范围,所以这是三个字符,分别为’\0’,’8’,’2’,而字符串到’\0’终止,所以串长为1。

1.B2.A3.C

【例5】以下程序的输出结果是__________

#include<

stdio.h>

string.h>

voidmain()

{

charst[20]="

hello\0\t\'

\\"

printf("

%d,%d\n"

strlen(st),sizeof(st));

}

A)9,9B)5,20C)13,20D)20,20

本例考查strlen函数与sizeof的区别。

strlen函数是字符串处理函数,它只统计串长,且不包括’\0’,sizeof求出的是整个数组的长度,所以两者是不同的。

B

【例6】以下程序的输出结果是_________

char*p1,*p2,str[50]="

ABCDEFG"

p1="

abcd"

p2="

efgh"

strcpy(str+1,p2+1);

strcpy(str+3,p1+3);

%s"

str);

A)AfghdEFGB)AbfhdC)AfhgdD)Afgd

本例考查字符串拷贝函数的使用

第一次拷贝用”fgh”取代了”BCDEFG”,拷贝结束后字符串str为”Afgh”,第二次拷贝用”d”取代了”h”,拷贝结束后字符串str为”Afgd”

D

【例7】定义如下数组s:

chars[51];

准备将字符串”Happynewyear”记录下来,_______是错误的输入语句

A)gets(s+2);

B)scanf(“%20s”,s);

C)for(i=0;

i<

15;

i++)s[i]=getchar();

s[i]=’\0’;

D)while((c=getchar())!

=’\n’)s[i++]=c;

本例考查的是字符串的输入。

字符串可以使用scanf函数与%s进行整体格式输入,也可以使用gets函数整体输入,还可以逐个字符输入。

注意使用%s格式输入时遇到空格或回车符都终止输入,所以选项B不能够完整输入,而是只记录了”Happy”。

选项C和D采用的是逐个字符输入的方式,这时,接收的字符串不会自动添加’\0’,所以最后要添加一个’\0’才能构成字符串。

【例8】有以下程序

stdlib.h>

{

char*p,*q;

p=(char*)malloc(sizeof(char)*20);

q=p;

scanf("

%s%s"

p,q);

%s%s\n"

}

若从键盘输入:

abcdef<

回车>

,则输出结果是:

A)defdefB)abcdefC)abcdD)dd

本例考查字符串的输入

指针p、q通过赋值后,同时指向长度为20字节的动态存储区域,所以在语句scanf(“%s%s”,p,q);

中,第二次读入的def覆盖掉第一次读入的abc。

p、q同时指向字符串def。

所以输出两个def。

【例9】有以下程序

charstr[]="

xyz"

*ps=str;

while(*ps)ps++;

for(ps--;

ps-str>

=0;

ps--)puts(ps);

执行后的输出结果是

A)yzB)zC)zD)x

xyzyzyzxy

xyzxyz

指针指向字符串的操作、字符串输出

指针ps指向存放字符串的数组str,循环while(*ps)ps++;

使指针ps指向字符串结束符,第二个循环首先使ps--让ps指向’z’然后输出ps所指的字符串,即”z”,接着指针ps向前挪动,直到ps-str==0,即ps指向str的首地址为止,每挪动一次都输出当前ps所指的字符串,所以依次输出”z”、”yz”、”xyz”。

【例10】有如下程序

charch[2][5]={"

6937"

"

8254"

},*p[2];

inti,j,s=0;

for(i=0;

2;

i++)p[i]=ch[i];

i++)

for(j=0;

p[i][j]>

'

\0'

j+=2)

s=10*s+p[i][j]-'

0'

printf("

%d\n"

s);

该程序的输出结果是_______。

A)69825B)63825C)6385D)693825

用指针数组中的指针指向字符串数组中的字符串的操作

指针p[0]指向“6937”,指针p[1]指向”8254”。

注意到两重for循环中的里层循环的步长为2,所以四次取出的p[i][j]分别为’6’、’3’、’8’、’5’,然后通过p[i][j]-‘0’使字符转换为数字,最后通过s=10*s+p[i][j]-‘0’;

把这四个数转换为一个4位数

【例11】语句printf("

a\bre\'

hi\'

y\\\bou\n"

);

的输出结果是______。

A)a\bre\'

y\\\bouB)a\bre\'

y\bou

C)re'

hi'

youD)abre'

(说明:

\b'

是退格符)

转义字符的使用

观察这个字符串发现,第一个字符是’a’,第二个字符’\b’正好是退格,所以第三个字符’r’覆盖掉第一个字符’a’,依此类推,本字符串中共有两个退格符,所有有两个字符因被覆盖掉而未输出。

注意’\’’是转义字符“单撇号”,’\\’是转义字符\。

【例12】以下程序运行后,输出结果是_______。

A)1234567B)7654321C)1711717D)7177171

voidfun(char*w,intn)

chart,*s1,*s2;

s1=w;

s2=w+n-1;

while(s1<

s2)

{

t=*s1++;

*s1=*s2--;

*s2=t;

}

char*p;

p="

1234567"

fun(p,strlen(p));

puts(p);

指针指向字符串的处理

此题属于比较繁琐的的题目。

注意指针s1和s2分别指向字符串p的开头字符和末尾字符,此题繁琐的地方在于while循环中的三次赋值。

首先把指针s1所指的字符赋给t,然后s1向后挪一个单位,再把s2所指的字符赋给s1所指的单元(注意这个时候s1已经指向第二个字符了),接着s2向前挪一个单位,把t的值赋给s2所指的单元(此时s2已经指向倒数第二个字符了)。

依此类推,注意两个指针的指向是随时变化的。

【例13】以下程序运行后,如果从键盘上输入:

book<

空格>

<

则输出的结果是_______。

A)*8B)#9C)#6D)*9

chara1[80],a2[80],*s1=a1,*s2=a2;

gets(s1);

gets(s2);

if(!

strcmp(s1,s2))printf("

*"

elseprintf("

#"

strlen(strcat(s1,s2)));

gets、strcpy、strcat函数的使用

因为gets函数可以把空格作为字符读入,所以s1与s2不相等,其中s2包含空格,s1<s2,那么if条件不满足,所以执行else输出”#”,两字符串连接后,长度为9(包括空格在内)所以第二个printf函数输出9。

【例14】设有如下定义char*aa[2]={"

ABCD"

则以下说法中正确的是_____。

A)aa数组元素的值分别是"

和"

B)aa是指针变量,它指向含有两个数组元素的字符型一维数组

C)aa数组的两个元素分别存放的是含有4个字符的一维字符数组的首地址

D)aa数组的两个元素中各自存放了字符'

a'

和'

A'

的地址

指向字符串的指针。

aa是一个指针数组。

数组元素是两个指针,两个指针分别指向两个字符串,所以它们的值是两个字符串的首地址,所以答案A不对。

aa是指针数组的数组名而不是变量,所以B不对。

数组元素aa[1]指向字符串"

,数组元素aa[2]指向字符串"

这两个字符串的所含有的字符都是5个而不是4个,所以C不对。

7.1.2填空题:

【例1】以下程序的输出结果是。

charch[3][5]={"

AAAA"

BBB"

CC"

\n%s\n"

ch[1]);

本例考查的是字符串数组。

可以用二维数组存放字符串数组,也可以使用指针数组分别指向若干个字符串。

本题中是使用二维数组存放字符串,所以输出ch[1]即输出第二个字符串”BBB”。

BBB

【例2】以下程序的输出结果是。

char*p="

abcdefgh"

*r;

long*q;

q=(long*)p;

q++;

r=(char*)q;

%s\n"

r);

本例考查指针指向字符串的操作方法

指针q的基类型为long,所以经过q++,指针挪动了4个字节,即从指向字符a挪到了指向字符e,所以输出的字符串为efgh

efgh

【例3】以下程序用来对从键盘上输入的两个字符串进行比较,然后输出两个字符串中第一个不相同字符的ASCII码之差。

例如:

输入的两个字符串分别为abcdefg和abceef,则输出为-1。

请填空(等考1998年9月第12题)

charstr1[100],str2[100];

inti,s;

\nInputstring1:

\n"

gets(str1);

\nInputstring2:

gets(str2);

i=0;

while((str1[i]==str2[i])&

&

str1[i]!

=【1】)

i++;

s=【2】;

本例考查字符串大小比较

本例是利用字符数组来存放字符串,并借助于字符数组元素的引用来对字符串中的每个字符进行操作。

第一空要求填写while循环的条件,题中已给出第一个条件:

str1[i]==str2[i],表示如果对应两字符相等,就继续比较下一个字符。

对于一个字符串而言,循环能进行的前提是该字符串没有结束,所以循环还应满足str1[i]!

=’\0’,因为’\0’的ASCII码值为0,所以这一空也可以填0。

题目要求输出两字符串第一个不相同字符的ASCII之差,程序的最后一条语句已明确提示,输出值为s的值,所以第二空应是把两对应字符之差赋给s。

【1】’\0’或0【2】str1[i]-str2[i]

【例4】设有两个字符串a、b,下面程序是将a、b的对应字符中的较大者存放在数组c的对应位置上。

请填空。

intk=0;

chara[80],b[80],c[80]={'

},*p,*q;

p=a;

q=b;

gets(a);

gets(b);

while(【1】)

{

if(【2】)

c[k]=*q;

elsec[k]=*p;

p++;

k++;

if(*p!

=0)

strcat(c,p);

else

strcat(c,q);

puts(c);

本例考查利用指针对字符串的操作。

本例采用指针指向两个字符串,通过指针的移动实现对字符数组中的每一个字符的操作。

因为题目的要求是把两个字符串中对应较大的字符放入字符串c中,所以【1】中应填入的是循环控制条件,考虑到如果两串中有一个遇到’\0’就不必再比下去了,所以【1】中的循环控制条件应该是两串都不结束,可以填*p!

=’\0’&

*q!

=’\0’,也可以填*p!

=0&

=0因为’\0’的ASCII码值就是0。

【2】中所填的是if语句的执行条件,如果条件为真就执行c[k]=*q;

否则执行c[k]=*p;

所以该条件应该能保证*q>

*p。

【1】*p!

='

【2】*q>

*p

【例5】下列程序段的输出结果是。

{charb[]="

Hello,you"

b[5]=0;

b);

字符串结束符在整个字符串中的作用、字符串结束符的ASCII码值

因为字符串结束符的ASCII码值为0,所以b[5]=0;

等价于b[5]=’\0’;

输出字符串时,到第一个’\0’为止,所以输出的字符串直到b[4]为止。

Hello

【例6】阅读程序:

charstr1[]="

howdoyoudo"

str2[10];

char*p1=str1,*p2=str2;

p2);

p1);

运行上面的程序,输入字符串HOWDOYOUDO则程序的输出结果是。

格式控制符”%s”的使用

因为格式控制符”%s”遇空格就终止读入,所以实际上读入的字符串p2只有”HOW”。

HOWhowdoyoudo#include<

conio.h>

voidfun(char*a){}voidmain()

7.2自测练习与参考答案

7.2.1选择题:

1.对两个数组a和b进行如下初始化

chara[]="

ABCDEF"

charb[]={’A’,’B’,’C’,’D’,’E’,’F’};

则以下叙述正确的是______。

A)a数组与b数组完全相同

B)a与b长度相同

C)a中存放字符串,b中存放字符。

D)a数组比b数组长度长

2.下面程序段的运行结果是_______。

charc[]="

\t\v\\\0will\n"

printf("

%d"

strlen(c));

A)14B)3C)9D)字符串中有非法字符,输出值不确定

3.满足字符串s1大于字符串s2时if条件为真,应当使用_______。

A)if(s1>

B)if(strcmp(s1,s2))

C)if(strcmp(s2,s1)>

0)

D)if(strcmp(s1,s2)>

4.下面判断正确的是_______。

A)char*a="

china"

等价于char*a;

*a="

B)charstr[10]={"

等价于charstr[10];

str[]={"

C)char*s="

等价于char*s;

s="

D)charc[4]="

abc"

d[4]="

等价于charc[4]=d[4]="

5.以下程序执行时的输出结果为_______。

chars1[]="

language"

s2[]="

program"

char*p1=s1,*p2=s2;

intk;

for(k=0;

k<

7;

k++)

if(*(p1+k)==p2[k])

putchar(*(k+p1));

A)ageB)gaC)languageD)有语法错误,不能运行

6.下述程序的输出是:

________。

intfun(char*s)

char*p=s;

while(*p!

returnp-s;

\n%d"

fun("

Hello!

"

));

A)3B)Hello!

6C)空值(即无输出)D)6

7.下列字符串的输出结果是_______。

char*s="

\"

C:

\\ANSI.SYS\"

A)字符串含非法字符,输出值不定B)"

C)"

\ANSI.SYS"

D)"

\\ANSI.SYS"

8.有如下定义:

chars1=”abcde”,s2=”aBcDe”;

则表达式strcmp(s1+1,s2+1)的值是________。

A)0B)负数C)正数D)非零值,无法确定正负

9.下列程序从终端输入一行字符作为字符串存入字符数组,然后输出。

请在每组中选择正确答案

chars[30],*sp;

inti;

29;

s[i]=getchar();

if(s[i]=='

\n'

break;

s[i]=1;

sp=2;

while(*sp)

putchar(*sp3);

(1)A)'

B)s[i--]C)'

D)s[--i]

(2)A)sB)s[0]C)'

D)'

(3)A)+1B)[++i]C)++D)[i--]

10.有以下程序

voidss(char*s,chart)

while(*s)

if(*s==t)*s

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1