C语言各章节单元测试题及答案字符串Word下载.docx
《C语言各章节单元测试题及答案字符串Word下载.docx》由会员分享,可在线阅读,更多相关《C语言各章节单元测试题及答案字符串Word下载.docx(20页珍藏版)》请在冰豆网上搜索。
对字符型数组不能用“=”整体赋值,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