admin 管理员组文章数量: 1087135
2024年3月22日发(作者:怎么打开php ini文件)
第7章 字符串
7.1 典型考试题剖析
7.1.1 选择题:
【例1】若有以下定义:char s[20]="progrmming",*ps=s;则不能代表字
符o的表达式是_______。
A) ps+2 B) s[2] C) ps[2] D) ps+=2,*ps
考点:指向字符串的指针
分析:ps是一个指针,加上一个整型数据后仍然是一个指针,ps+2表
示的是'o'的地址,而不是字符o
答案:A
【例2】以下选项中,不能正确赋值的是________
A) char s1[10];s1=="Ctest";
B) char s2[ ]={'C','t','e','s','t'};
C) char s3[20]="Ctest";
D) char *s4="Ctestn";
考点:本例考查字符数组和字符串的初始化方法
分析:注意A选项的错误是非常典型的错误,错误之处就在于,数组名
是一个地址常量,给常量赋值是不合语法的,所以给数组名赋值是非法
的操作。选项B是一个合法的字符数组初始化形式,但注意s2不构成字
符串,因为数组s2中没有字符串结束符。
答案:A
【例3】下列描述中不正确的是__________
A) 字符型数组中可以存放字符串
B) 可以对字符型数组进行整体输入、输出
C) 可以对整型数组进行整体输入、输出
D) 不能在赋值语句中通过赋值运算符“=”对字符型数组进行整体赋值
考点:本例考查字符数组和字符串的基本概念。
分析:字符型数组中可以存放字符串,所以A是正确的。如果字符型数
组中存放的是字符串,则可以对其进行整体输入输出,所以B也是正确
的。但除了构成字符串的字符数组以外,其他数组是不能进行整体输入、
输出的,所以C错误。对字符型数组不能用“=”整体赋值,char
s[ ]=”Hello”;这种形式称为“初始化”而不叫赋值语句。
答案:C
【例4】对于以下字符串,说明表达式strlen(s)的值。
s[10]={‘a’,’0’,’b’,’c’,’d’,’0’};_______
A) 10 B) 1 C) 6 D) 4
s[ ]=”141141abct”;
A) 9 B) 12 C) 13 D) 14
*s=”x69082n”;
_________
A) 3 B) 5 C) 1 D) 字符串中有非法字符
考点:本例考查strlen函数及字符串结束符和转义字符的用法。
分析:因为字符串遇到第一个’0’即终止,不管第一个’0’后面还
有多少字符,都认为字符串已经终止,所以第一题中的串长为1(注意
串长不包括’0’)。因为转义字符作为一个字符处理,所以第二题
中’’是一个字符,’141’是一个字符,’t’是一个字符,所以
串长为9。第三题的第一个字符是十六进制转义字符,’082’容易被
误认为是八进制转义字符,但是注意,8超过了八进制的范围,所以这
是三个字符,分别为’0’,’8’,’2’,而字符串到’0’终止,
所以串长为1。
答案:1.B 2.A 3.C
【例5】以下程序的输出结果是__________
#include
#include
void main()
{
char st[20]="hello0t'";
printf("%d,%dn",strlen(st),sizeof(st));
}
A) 9,9 B) 5,20 C) 13,20 D) 20,20
考点:本例考查strlen函数与sizeof的区别。
分析: strlen函数是字符串处理函数,它只统计串长,且不包括’0’,
sizeof求出的是整个数组的长度,所以两者是不同的。
答案:B
【例6】以下程序的输出结果是_________
#include
#include
void main()
{
char *p1,*p2,str[50]="ABCDEFG";
p1="abcd";
p2="efgh";
strcpy(str+1,p2+1);
strcpy(str+3,p1+3);
printf("%s",str);
}
A) AfghdEFG B) Abfhd C) Afhgd D) Afgd
考点:本例考查字符串拷贝函数的使用
分析:第一次拷贝用”fgh”取代了”BCDEFG”,拷贝结束后字符串str
为”Afgh”,第二次拷贝用”d”取代了”h”,拷贝结束后字符串str
为”Afgd”
答案:D
【例7】定义如下数组s:char s[51];准备将字符串”Happy new year”记
录下来,_______是错误的输入语句
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; s[i]=’0’;
考点:本例考查的是字符串的输入。
分析:字符串可以使用scanf函数与%s进行整体格式输入,也可以使
用gets函数整体输入,还可以逐个字符输入。注意使用%s格式输入时
遇到空格或回车符都终止输入,所以选项B不能够完整输入,而是只记
录了”Happy”。选项C和D采用的是逐个字符输入的方式,这时,接收
的字符串不会自动添加’0’,所以最后要添加一个’0’才能构成字
符串。
答案:B
【例8】有以下程序
#include
#include
void main()
{
char *p,*q;
p=(char*)malloc(sizeof(char)*20); q=p;
scanf("%s%s",p,q); printf("%s%sn",p,q);
}
若从键盘输入:abc def<回车>,则输出结果是:
A) def def B) abc def C) abc d
D) d d
考点:本例考查字符串的输入
分析:指针p、q通过赋值后,同时指向长度为20字节的动态存储区域,
所以在语句scanf(“%s%s”,p,q);中,第二次读入的def覆盖掉第一次
读入的abc。p、q同时指向字符串def。所以输出两个def。
答案:A
【例9】有以下程序
#include
void main()
{
char str[]="xyz",*ps=str;
while(*ps) ps++;
for(ps--;ps-str>=0;ps--) puts(ps);
}
执行后的输出结果是
A) yz B) z C) z D) x
xyz yz yz xy
xyz xyz
考点:指针指向字符串的操作、字符串输出
分析:指针ps指向存放字符串的数组str,循环while(*ps)ps++;使指
针ps指向字符串结束符,第二个循环首先使ps--让ps指向’z’然后
输出ps所指的字符串,即”z”,接着指针ps向前挪动,直到ps-str==0,
即ps指向str的首地址为止,每挪动一次都输出当前ps所指的字符串,
所以依次输出”z”、”yz”、”xyz”。
答案:C
【例10】有如下程序
#include
void main()
{
char ch[2][5]={"6937","8254"},*p[2];
int i,j,s=0;
for(i=0;i<2;i++) p[i]=ch[i];
for(i=0;i<2;i++)
for(j=0;p[i][j]>'0';j+=2)
s=10*s+p[i][j]-'0';
printf("%dn",s);
}
该程序的输出结果是_______。
A) 69825 B) 63825 C) 6385 D) 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位
数
答案:C
【例11】语句printf("abre'hi'yboun");的输出结果是______。
A) abre'hi'ybou B) abre'hi'ybou
C) re'hi'you D) abre'hi'ybou
(说明:'b'是退格符)
考点:转义字符的使用
分析:观察这个字符串发现,第一个字符是’a’,第二个字符’b’
正好是退格,所以第三个字符’r’覆盖掉第一个字符’a’,依此类推,
本字符串中共有两个退格符,所有有两个字符因被覆盖掉而未输出。注
意’’’是转义字符“单撇号”,’’是转义字符。
答案:C
【例12】以下程序运行后,输出结果是_______。
A) 1234567 B) 7654321 C) 1711717 D) 7177171
#include
#include
void fun(char *w,int n)
{
char t,*s1,*s2;
s1=w; s2=w+n-1;
while(s1 { t=*s1++; *s1=*s2--; *s2=t; } } void main() { char *p; p="1234567"; fun(p,strlen(p)); puts(p); } 考点:指针指向字符串的处理 分析:此题属于比较繁琐的的题目。注意指针s1和s2分别指向字符串 p的开头字符和末尾字符,此题繁琐的地方在于while循环中的三次赋 值。首先把指针s1所指的字符赋给t,然后s1向后挪一个单位,再把 s2所指的字符赋给s1所指的单元(注意这个时候s1已经指向第二个字 符了),接着s2向前挪一个单位,把t的值赋给s2所指的单元(此时 s2已经指向倒数第二个字符了)。依此类推,注意两个指针的指向是随 时变化的。 答案:C 【例13】以下程序运行后,如果从键盘上输入: book <回车> book <空格><回车> 则输出的结果是_______。 A) *8 B) #9 C) #6 D) *9 #include #include void main() { char a1[80],a2[80],*s1=a1, *s2=a2; gets(s1); gets(s2); if(! strcmp(s1,s2)) printf("*"); else printf("#"); printf("%dn",strlen(strcat(s1,s2))); } 考点:gets、strcpy、strcat函数的使用 分析:因为gets函数可以把空格作为字符读入,所以s1与s2不相等, 其中s2包含空格, s1<s2,那么if条件不满足,所以执行else输 出”#”,两字符串连接后,长度为9(包括空格在内)所以第二个printf 函数输出9。 答案:B 【例14】设有如下定义char *aa[2]={"abcd","ABCD"};则以下说法中正确 的是_____。 A) aa数组元素的值分别是"abcd"和"ABCD" B) aa是指针变量,它指向含有两个数组元素的字符型一维数组 C) aa数组的两个元素分别存放的是含有4个字符的一维字符数组的首地 址 D) aa数组的两个元素中各自存放了字符'a'和'A'的地址 考点:指向字符串的指针。 分析:aa是一个指针数组。数组元素是两个指针,两个指针分别指向 两个字符串,所以它们的值是两个字符串的首地址,所以答案A不对。 aa是指针数组的数组名而不是变量,所以B不对。数组元素aa[1]指向 字符串"abcd",数组元素aa[2]指向字符串"ABCD"。这两个字符串的所 含有的字符都是5个而不是4个,所以C不对。 答案:D 7.1.2 填空题: 【例1】以下程序的输出结果是 。 #include void main() { char ch[3][5]={"AAAA","BBB","CC"}; printf("n%sn",ch[1]); } 考点:本例考查的是字符串数组。 分析:可以用二维数组存放字符串数组,也可以使用指针数组分别指向 若干个字符串。本题中是使用二维数组存放字符串,所以输出ch[1]即 输出第二个字符串”BBB”。 答案: BBB 【例2】以下程序的输出结果是 。 #include void main() { char *p="abcdefgh",*r; long *q; q=(long *)p; q++; r=(char *)q; printf("%sn",r); } 考点:本例考查指针指向字符串的操作方法 分析:指针q的基类型为long,所以经过q++,指针挪动了4个字节, 即从指向字符a挪到了指向字符e,所以输出的字符串为efgh 答案: efgh 【例3】以下程序用来对从键盘上输入的两个字符串进行比较,然后输出两 个字符串中第一个不相同字符的ASCII码之差。例如:输入的两个字符串分别为 abcdefg和abceef,则输出为-1。请填空 (等考1998年9月第12题) #include void main() { char str1[100],str2[100]; int i,s; printf("n Input string1:n"); gets(str1); printf("n Input string2:n"); gets(str2); i=0; while((str1[i]==str2[i])&&str1[i]!=【1】) i++; s=【2】; printf("%dn",s); } 考点:本例考查字符串大小比较 分析:本例是利用字符数组来存放字符串,并借助于字符数组元素的引 用来对字符串中的每个字符进行操作。第一空要求填写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的对应位置上。请填空。 #include #include void main() { int k=0; char a[80],b[80],c[80]={ '0'},*p,*q; p=a;q=b; gets(a);gets(b); while(【1】) { if(【2】) c[k]=*q; else c[k]=*p; p++; q++; k++; } if (*p!=0) strcat(c,p); else strcat(c,q); puts(c); } 考点:本例考查利用指针对字符串的操作。 分析:本例采用指针指向两个字符串,通过指针的移动实现对字符数组 中的每一个字符的操作。因为题目的要求是把两个字符串中对应较大的 字符放入字符串c中,所以【1】中应填入的是循环控制条件,考虑到如 果两串中有一个遇到’0’就不必再比下去了,所以【1】中的循环控制 条件应该是两串都不结束,可以填*p!=’0’&&*q!=’0’,也可以填 *p!=0&&*q!=0因为’0’的ASCII码值就是0。【2】中所填的是if语 句的执行条件,如果条件为真就执行c[k]=*q;否则执行c[k]=*p;所以该 条件应该能保证*q>*p。 答案:【1】*p!='0'&&*q!='0' 【2】*q>*p 【例5】下列程序段的输出结果是 。 #include void main() { char b[]="Hello,you"; b[5]=0; printf("%sn", b ); } 考点:字符串结束符在整个字符串中的作用、字符串结束符的ASCII码 值 分析:因为字符串结束符的ASCII码值为0,所以b[5]=0;等价于 b[5]=’0’;输出字符串时,到第一个’0’为止,所以输出的字符串 直到b[4]为止。 答案: Hello 【例6】阅读程序: #include void main() { char str1[]="how do you do" ,str2[10]; char *p1=str1,*p2=str2; scanf("%s",p2); printf("%s",p2); printf("%sn",p1); } 运行上面的程序,输入字符串HOW DO YOU DO 则程序的输出结果 是 。 考点:格式控制符”%s”的使用 分析:因为格式控制符”%s”遇空格就终止读入,所以实际上读入的字 符串p2只有”HOW”。 答案: HOWhow do you do 7.2自测练习与参考答案 7.2.1 选择题: 1.对两个数组a和b进行如下初始化 char a[]="ABCDEF"; char b[]={’A’,’B’,’C’,’D’,’E’,’F’}; 则以下叙述正确的是______。 A) a数组与b数组完全相同 B) a与b长度相同 C) a中存放字符串,b中存放字符。 D) a数组比b数组长度长 2.下面程序段的运行结果是_______。 char c[]="tv0willn"; printf("%d",strlen(c)); A) 14 B) 3 C) 9 D) 字符串中有非法字符,输出值不 确定 3.满足字符串s1大于字符串s2时if条件为真,应当使用_______。 A) if(s1>s2) B) if(strcmp(s1,s2)) C) if(strcmp(s2,s1)>0) D) if(strcmp(s1,s2)>0) 4.下面判断正确的是_______。 A) char *a="china";等价于char *a; *a="china"; B) char str[10]={"china"};等价于char str[10];str[]={"china"}; C) char *s="china";等价于char *s;s="china"; D) char c[4]="abc",d[4]="abc";等价于char c[4]=d[4]="abc"; 5.以下程序执行时的输出结果为_______。 #include void main() { char s1[]="language",s2[]="program"; char *p1=s1,*p2=s2; int k; for(k=0;k<7;k++) if(*(p1+k)==p2[k]) putchar(*(k+p1)); } A) age B) ga C) language D) 有语法错误,不能运行 6.下述程序的输出是:________。 #include int fun(char *s) { char *p=s; while(*p!='0') p++; return p-s; } void main() { printf("n%d",fun("Hello!")); } A) 3 B) Hello!6 C) 空值(即无输出) D) 6 7.下列字符串的输出结果是_______。 char *s=""C:""; printf("%s",s); A) 字符串含非法字符,输出值不定 B) "C:" C) "C:" D) "C:" 8.有如下定义: char s1=”abcde”,s2=”aBcDe”; 则表达式strcmp(s1+1,s2+1)的值是________。 A) 0 B)负数 C) 正数 D) 非零值,无法确定正负 9.下列程序从终端输入一行字符作为字符串存入字符数组,然后输出。请在每组 中选择正确答案 #include void main() { char s[30],*sp; int i; for(i=0;i<29;i++) { s[i]=getchar(); if(s[i]=='n') break; } s[i]= 1 ; sp= 2 ; while(*sp) putchar(*sp 3 ); } (1)A) 'n' B) s[i--] C) '0' D) s[--i] (2)A) s B) s[0] C) '0' D) 'n' (3)A) +1 B) [++i] C) ++ D) [i--] 10.有以下程序 #include void ss(char *s,char t) { while(*s) { if(*s==t) *s=t-'a'+'A'; s++; } } void main() { char str1[100]="abcddfefdbd",c='d'; ss(str1,c); printf("%sn",str1); } 程序运行后的输出结果是_______。 A) ABCDDEFEDBD B) abcDDfefDbD C) abcAAfefAbA D) Abcddfefdbd 11.以下程序中函数scmp的功能是返回形参指针s1和 s2所指字符串中较小字 符串的首地址 #include #include char *scmp(char *s1,char *s2) { if(strcmp(s1,s2)<0) return(s1); else return(s2); } void main() { int i; char string[20],str[3][20]; for(i=0;i<3;i++) gets(str[i]); strcpy(string,scmp(str[0],str[1]));/*库函数strcpy对字符串进行 复制*/ strcpy(string,scmp(string,str[2])); printf("%sn",string); } 运行时依次输入:abcd、abba和abc三个字符串,则输出结果为 A) abcd B) abba C) abc D) abca 12.有以下程序 main() { char *s[]={"one","two","three"},*p; p=s[1]; printf("%c,%sn",*(p+1),s[0]); } 执行后输出结果是_______。 A) n,two B) t,one C)w,one D) o,two 7.2.2 填空题: 1.以下程序运行后的输出结果是 。 main() { char s[ ]="9876",*p; for ( p=s ; p printf("%sn", p); } 2.以下程序的输出结果是 。 #include void main() { char s[]="abcdef"; s[3]='0'; printf("%sn",s); } 3.有十个字符串。下面程序的功能是在每个字符串中,找出最大字符按一一对应 的顺序放入一维数组a中,即第i个字符串中的最大字符放入a[i]中,输出每 个字符串的最大字符。请填空。 #include void main() { char s[10][20]; int a[10],i,j; for(i=0;i<10;i++) gets(s[i]); for(i=0;i<10;i++) { 【1】; for(j=1;s[i][j]!='0';j++) if(a[i] 【2】; } for(i=0;i<10;i++) printf(" %d%c",i,a[i]); } 4.下面程序的运行结果是 。 #include void main() { char s[]="ABCCDA"; int k; char c; for(k=1;(c=s[k])!='0';k++) { switch(c) { case 'A':putchar('%');continue; case 'B':++k;break; default:putchar('*'); case 'C':putchar('&');continue; } putchar('#'); } } 5.下面程序的功能是输出两个字符串中较小的串的长度。请填空。 #include"stdio.h" #include"string.h" void main() { char str1[20],str2[20]; int i,k,num; gets(str1); gets(str2); i=strlen(str1); k=strlen(str2); num=【1】?【2】:【3】; printf("%dn",num); } 6.以下函数的功能是删除字符串s中的所有数字字符。请填空。 void dele(char*s) { int n=0,i; for(i=0;s[i];i++) if(【1】) s[n++]=s[i]; s[n]=【2】; } 7.下面程序的功能是将两个字符s1和s2连接起来。请填空。 #include void conj(char *p1,char * p2); void main() { char s1[80],s2[80]; gets(s1); gets(s2); conj(s1,s2); puts(s1); } void conj(char *p1,char * p2) { char *p=p1; while (*p1)【1】; while (*p2) { *p1=【2】; p1++; p2++; } *p1='0'; 【3】; } 8.下面程序是判断输入的字符串是否是“回文”,(顺读和倒读都一样的字符串 称“回文”,如 level)。请填空 #include #include void main() { char s[81],*p1,*p2; int n; gets(s); n=strlen(s); p1=s; p2=【1】; while(【2】) { if(*p1!=*p2) break; else { p1++;【3】;} } if(p1 printf("Non"); else printf("Yesn"); } 7.2.3 参考答案: 一.选择题: 1.D 2.B 3.D 4.C 5.B 6.D 7.C 8.C 9. (2)A (3)C 10.B 11.B 12.C 二.填空题: 1. 9876 876 2. abc 3.【1】a[i]=s[i][0] 4. #&*&% (1)C 【2】a[i]=s[i][j] 5.【1】strcmp(str1,str2)<0 【2】i 【3】k 6.【1】s[i]<'0'||s[i]>'9' 【2】'0' 7.【1】p1++ 【2】*p2 【3】p1=p 8.【1】s+n-1 【2】p1 【3】p2--
版权声明:本文标题:C语言各章节单元测试题及答案——字符串 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/p/1711059086a586316.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论