第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="Ctest\n";
✧ 考点:本例考查字符数组和字符串的初始化方法
✧ 分析:注意A选项的错误是非常典型的错误,错误之处就在于,数组名是一个地址常量,给常量赋值是不合语法的,所以给数组名赋值是非法的操作。选项B是一个合法的字符数组初始化形式,但注意s2不构成字符串,因为数组s2中没有字符串结束符。
✧ 答案:A
【例3】下列描述中不正确的是__________
A) 字符型数组中可以存放字符串
B) 可以对字符型数组进行整体输入、输出
C) 可以对整型数组进行整体输入、输出
D) 不能在赋值语句中通过赋值运算符“=”对字符型数组进行整体赋值
✧ 考点:本例考查字符数组和字符串的基本概念。
✧ 分析:字符型数组中可以存放字符串,所以A是正确的。如果字符型数组中存放的是字符串,则可以对其进行整体输入输出,所以B也是正确的。但除了构成字符串的字符数组以外,其他数组是不能进行整体输入、输出的,所以C错误。对字符型数组不能用“=”整体赋值,char s[ ]=”Hello”;这种形式称为“初始化”而不叫赋值语句。
✧ 答案:C
【例4】对于以下字符串,说明表达式strlen(s)的值。
1.char s[10]={‘a’,’\0’,’b’,’c’,’d’,’\0’};_______
A) 10 B) 1 C) 6 D) 4
c语言如何创建字符串数组2.char s[ ]=”\\141\141abc\t”;
A) 9 B) 12 C) 13 D) 14
3.char *s=”\x69\082\n”;_________
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<stdio.h>
#include<string.h>
void main()
{
char st[20]="hello\0\t\'\\";
printf("%d,%d\n",strlen(st),sizeof(st));
}
A) 9,9 B) 5,20 C) 13,20 D) 20,20
✧ 考点:本例考查strlen函数与sizeof的区别。
✧ 分析: strlen函数是字符串处理函数,它只统计串长,且不包括’\0’,sizeof求出的是整个数组的长度,所以两者是不同的。
✧ 答案:B
【例6】以下程序的输出结果是_________
#include<stdio.h>
#include<string.h>
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<stdlib.h>
#include<stdio.h>
void main()
{
char *p,*q;
p=(char*)malloc(sizeof(char)*20); q=p;
scanf("%s%s",p,q); printf("%s%s\n",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<stdio.h>
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<stdio.h>
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("%d\n",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("a\bre\'hi\'y\\\bou\n");的输出结果是______。
A) a\bre\'hi\'y\\\bou B) a\bre\'hi\'y\bou
C) re'hi'you D) abre'hi'y\bou
(说明:'\b'是退格符)
✧ 考点:转义字符的使用
✧ 分析:观察这个字符串发现,第一个字符是’a’,第二个字符’\b’正好是退格,所以第三个字符’r’覆盖掉第一个字符’a’,依此类推,本字符串中共有两个退格符,所有有两个字符因被覆盖掉而未输出。注意’\’’是转义字符“单撇号”,’\\’是转义字符\。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论