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--


本文标签: 字符串 字符 数组 输出 指针