C语言题库第6章指针.docx
《C语言题库第6章指针.docx》由会员分享,可在线阅读,更多相关《C语言题库第6章指针.docx(27页珍藏版)》请在冰豆网上搜索。
C语言题库第6章指针
第六章指针
一、单项选择
1.若已定义chars[10];则在下面表达式中不表示s[1]的地址是()。
A.&s[1]
B.&s[0]+1
C.s+1
D.s++
2.下面程序段的运行结果是()。
chara[]=”language”,*p;
p=a;
while(*p!
='u'){printf(“%c”,*p-32);p++;}
A.language
B.langUAGE
C.LANGUAGE
D.LANG
3.下面能正确进行字符串赋值操作的是()
A.chars[5]={'A','B','C','D','E'};
B.chars[5]={"ABCDE"};
C.char*s;s="ABCDE";
D.char*s;scanf("%s",s);
4.设p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下能正确执行并得到有意义的结果的赋值语句是()。
A.p2=c;
B.c=*p1+*p2;
C.p1=p2;
D.c=*p1*(*p2);
5.已有函数max(a,b),为了让函数指针变量p指向函数max,正确的赋值方法是()。
A.*p=max(a,b);
B.*p=max;
C.p=max;
D.p=max(a,b);
6.以下正确的叙述是()。
A.C语言允许main函数带形参,且形参个数和形参名均可由用户指定
B.当main函数带有形参时,传给形参的值只能从命令行中得到
C.若有说明:
intmain(intargc,char**argv),则argc的值必须大于1
D.C语言允许main函数带形参,形参名只能是argc和argv
7.若有定义:
int(*p)[4];则标识符p()。
A.是一个指针数组名
B.定义不合法
C.是一个指向整型变量的指针
D.是一个指针,它指向一个含有四个整型元素的一维数组
8.设有程序段:
chars[]="china";char*p;p=s;则下面叙述正确的是()。
A.*p与s[0]相等
B.数组s中的内容和指针变量p中的内容相等
C.s数组长度和p所指向的字符串长度相等
D.s和p完全相同
9.下面程序段的运行结果是()。
char*s=”abcde”;
s+=2;printf(“%s”,s);
A.字符'c'的地址
B.不确定
C.cde
D.字符'c'
10.下面判断正确的是()。
A.charstr[10]={"china"};等价于charstr[10];str[]={"china";}
B.charc[4]="abc",d[4]="abc";等价于charc[4]=d[4]="abc";
C.char*a="china";等价于char*a;*a="china";
D.char*s="china";等价于char*s;s="china";
11.设有程序段:
chars[]=”china”;char*p;p=s;则下面叙述正确的是()
A.数组s中的内容和指针变量p中的内容相等
B.*p与s[0]相等
C.s数组长度和p所指向的字符串长度相等
D.s和p完全相同
12.已有变量定义和函数调用语句:
inta=25;print_value(&a);下面函数的输出结果是()
voidprint_value(int*x)
{printf(“%d\n”,++*x);}
A.24
B.23
C.25
D.26
13.若有说明:
int*p,m=5,n;以下程序段正确的是()
A.p=&n;*p=m;
B.p=&n;scanf("%d",&p);
C.p=&n;scanf("%d",*p);
D.scanf("%d",&n);*p=n;
14.变量的指针,其含义是指该变量的()
A.值
B.地址
C.一个标志
D.名
15.已有定义intk=2;int*ptr1,*ptr2;且ptr1和ptr2均已指向变量k,下面不能正确执行的赋值语句是()
A.ptr2=k;
B.k=*ptr1+*ptr2;
C.k=*ptr1*(*ptr2);
D.ptr1=ptr2
16.8882.若要对a进行自增运算,则a应具有下面说明()。
Intb[10],*a=b;
二、程序设计
1.8885./*假定输入的字符串中只包含字母和*号。
请编写函数fun,它的功能是:
除了字符串前导的*号之外,将串中其他*号全部删除。
在编写函数时,不得使用C语言提供的字符串函数。
例如,若字符串中的内容为****A*BC*DEF*G*******,删除后,字符串中的内容则应当是****ABCDEFG。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
*/
#include
#include
voidfun(char*a)
{
/************Begin*************/
/************End**************/
}
intmain()
{
chars[81];
FILE*in,*out;
inti;
printf("Enterastring:
\n");
gets(s);
fun(s);
printf("Thestringafterdeleted:
\n");
puts(s);
/******************************/
in=fopen("in21.dat","r");
out=fopen("out21.dat","w");
for(i=0;i<8;i++)
{
fscanf(in,"%s",s);
fun(s);
fprintf(out,"%s\n",s);
}
fclose(in);
fclose(out);
/******************************/
return0;
}
【参考代码】
inti=0;
char*p=a;
while(*p&&*p=='*')
{
a[i]=*p;i++;p++;
}
while(*p)
{
if(*p!
='*')
{
a[i]=*p;i++;
}
p++;
}
a[i]='\0';
2.8863./*请编写函数fun,该函数的功能是:
统计一行字符串中单词的个数,作为函数值返回。
一行字符串在主函数中输入,规定所有单词由小写字母组成,单词之间有若干个空格隔开,一行的开始没有空格。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
*/
#include
#include
#defineN80
intfun(char*s)
{
/************Begin*************/
/*************End*************/
}
intmain()
{
FILE*wf,*in;
charline[N];
intnum=0;
printf("Enterastring:
\n");
gets(line);
num=fun(line);
printf("Thenumberofwordis:
%d\n\n",num);
/******************************/
in=fopen("in19.dat","r");
wf=fopen("out19.dat","w");
fgets(line,81,in);
fprintf(wf,"%d",fun(line));
fclose(wf);
fclose(in);
/*****************************/
return0;
}
【参考代码】
inti,j=0;
for(i=0;s[i]!
='\0';i++)
if(s[i]!
=''&&(s[i+1]==''||s[i+1]=='\0'))
/*如果一个字母的下一个字符为空格或者结束标记,则表示一个单词结束*/
j++;
returnj;/*返回单词个数*/
3.8860./*假定输入的字符串中只包含字母和*号。
请编写函数fun,它的功能是:
将字符串中的前导*号全部删除,中间和后面的*号不删除。
例如,若字符串中的内容为****A*BC*DEF*G*******,删除后,字符串中的内容则应当是A*BC*DEF*G*******。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
*/
#include
voidfun(char*a)
{
/************Begin**************/
/************End*************/
}
intmain()
{
FILE*wf,*in;
inti;
chars[81],t[81]="****A*BC*DEF*G*******";
printf("Enterastring:
\n");
gets(s);
fun(s);
printf("Thestringafterdeleted:
\n");puts(s);
/******************************/
in=fopen("in18.dat","r");
wf=fopen("out18.dat","w");
for(i=0;i<8;i++)
{
fscanf(in,"%s",t);
fun(t);
fprintf(wf,"%s\n",t);
}
fclose(in);
fclose(wf);
/*****************************/
return0;
【参考代码】
char*p=a;
while(*p=='*')
p++;
/*指针p指向字符串第一个字母*/
for(;*p!
='\0';p++,a++)
*a=*p;
*a='\0';
4.8852./*请编写函数fun,该函数的功能是:
判断字符串是否为回文,若是则函数返回1,主函数中输出"YES",否则返回0,主函数中输出"NO"。
回文是指顺读和倒读都一样的字符串。
例如,字符串LEVEL是回文,而字符串123312就不是回文。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
*/
#include
#defineN80
intfun(charstr[])
{
/***************Begin************/
/***************End************/
}
intmain()
{
chars[N];
FILE*out,*in;
chartest[][80]={"1234321","123421","123321","abcdCBA"};
inti;
printf("Enterastring:
");
gets(s);
printf("\n\n");
puts(s);
if(fun(s))
printf("YES\n");
else
printf("NO\n");
/************************************/
in=fopen("in12.dat","r");
for(i=0;i<4;i++)
fscanf(in,"%s",test[i]);
out=fopen("out12.dat","w");
for(i=0;i<4;i++)
if(fun(test[i]))
fprintf(out,"YES\n");
else
fprintf(out,"NO\n");
fclose(in);
fclose(out);
/************************************/
return0;
}
【参考代码】
intfun(charstr[])
{
inti,n=0,fg=1,j=0;
while(str[j])
{
n++;
j++;
}
for(i=0;i/*循环比较字符*/
if(str[i]==str[n-1-i]);
/*相同,什么都不作*/
else
/*不同,直接跳出循环*/
{
fg=0;
break;
}
returnfg;
}
5.8862./*请编写函数fun,其功能是:
将两个两位数的正整数a、b合并形成一个整数放在c中。
合并的方式是:
将a数的十位和个位依次放在c数的千位和十位上,b数的十位和个位依次放在c数的百位和个位上。
例如,当a=45,b=12,调用该项函数后,c=4152。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
*/
#include
#include
voidfun(inta,intb,long*c)
{
/************Begin************/
/************End***************/
}
intmain()
{
inta,b,i;
longc;
FILE*out,*in;
printf("Inputa,b:
");
scanf("%d%d",&a,&b);
fun(a,b,&c);
printf("Theresultis:
%ld\n",c);
/******************************/
in=fopen("in20.dat","r")
out=fopen("out20.dat","w");
for(i=10;i<20;i++)
{
fscanf(in,"%d%d",&a,&b);
fun(a,b,&c);
fprintf(out,"%d\n",c);
}
fclose(out);
fclose(in);
/******************************/
return0;
}
【参考代码】
*c=(a/10)*1000+(b/10)*100+(a%10)*10+b%10;
6.8880./*请编一个函数fun(char*s),该函数的功能是把字符串中的内容逆置。
例如,字符串中原有的字符串为abcdefg,则调用该函数后,串中的内容为gfedcba。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
*/
#include
#include
#defineN81
voidfun(char*s)
{
/************Begin*************/
/************End**************/
}
intmain()
{
chara[N];
FILE*out,*in;
printf("Enterastring:
");
gets(a);
printf("Theoriginalstringis:
");
puts(a);
fun(a);
printf("\n");
printf("Thestringaftermodified:
");
puts(a);
strcpy(a,"HelloWorld!
ThisisafirstCprogram!
");
fun(a);
/******************************/
in=fopen("in17.dat","r");
fgets(a,81,in);
out=fopen("out17.dat","w");
fprintf(out,"%s",a);
fclose(out);
fclose(in);
/******************************/
return0;
}
【参考代码】
charch;
inti,m,n;
i=0;
m=n=strlen(s)-1;
while(i<(n+1)/2)
{
ch=s[i];
s[i]=s[m];
s[m]=ch;
i++;
m--;
}
三、程序改错
1.9812./*下列给定程序中,函数fun的功能是:
分别统计字符串中大写字母和小写字母的个数。
例如,给字符串s输入:
AaaaBBb123CCccccd,则应输出结果:
upper=5,lower=9。
请改正程序中的错误,使它能计算出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
*/
#include
#include
/**********ERROR**********/
voidfun(char*s,inta,intb)
{
while(*s)
{
if(*s>='A'&&*s<='Z')
/**********ERROR**********/
a++;
if(*s>='a'&&*s<='z')
/**********ERROR**********/
b++;
s++;
}
}
intmain()
{
chars[100];
intupper=0,lower=0;
printf("\npleaseastring:
");
gets(s);
fun(s,&upper,&lower);
printf("\nupper=%dlower=%d\n",upper,lower);
return0;
【改错1】voidfun(char*s,int*a,int*b)
【改错2】(*a)++;
【改错3】(*b)++;
2.9332./*下列给定函数中,函数fun的功能是:
统计字符串中各元音字母(即A、E、I、O、U)的个数。
注意:
字母不分大小写。
例如,输入THIsisaboot,则应输出是10220。
请改正程序中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
*/
#include
/**********ERROR**********/
fun(char*s,intnum[5])
{intk,i=5;
for(k=0;k
/**********ERROR**********/
num[i]=0;
for(;*s;s++)
{i=-1;
/**********ERROR**********/
switch(s)
{case'a':
case'A':
{i=0;break;}
case'e':
case'E':
{i=1;break;}
case'i':
case'I':
{i=2;break;}
case'o':
case'O':
{i=3;break;}
case'u':
case'U':
{i=4;break;}
}
if(i>=0)
num[i]++;
}
}
intmain()
{chars1[81];intnum1[5],i;
printf("\nPleaseenterastring:
");
gets(s1);
fun(s1,num1);
for(i=0;i<5;i++)printf("%d",num1[i]);
printf("\n");
return0;
}
【改错1】voidfun(char*s,intnum[5])
【改错2】num[k]=0;
【改错3】switch(*s)
3.8876./*下列给定程序中,函数fun的功能是:
计算s所指字符串中含有t所指字符串的数目,并作为函数值返回。
请改正函数fun中的错误或在横线处填上适当的内容并把横线删除,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
*/
#include
#include
#include
#include
#defineN80
intfun(char*s,char*t)
{intn;
char*p,*r;
n=0;
p=&s[0];
/**********ERROR**********/
*r=t;
while(*p)
{
if(*r==*p)
{
r++;
if(*r=='\0')
{
n++;
/**********ERROR**********/
【1】;
}
}
p++;
}
returnn;
}
intmain()
{chara[N],b[N];intm;
system("CLS");
printf("\nPleaseenterstringa:
");
gets(a);
printf("\nPleaseentersubstringb:
");
gets(b);
m=fun(a,b);
m=printf("\nTheresultis:
m=%d\n",m);
return0;
}
【改错1】r=t;
【改错2】r=t;
4.8853./*下列给定程序中,函数fun的功能是:
从n个学生的成绩中统计出低于平均分的学生人数,此人数由函数值返回,
平均分存放在形参aver所指的存储单元中。
例如输入8名学生的成绩:
80.5607290.59851.58864
则低于平均分的学生人数为4(平均分为75.5625