第六章 指针
一、单项选择
1.若已定义char s[10];则在下面表达式中不表示s[1]的地址是( )。
A.&s[1]
B.&s[0]+1
C.s+1
D.s++
2.下面程序段的运行结果是( )。
char a[ ]=”language” , *p ;
p=a ;
while (*p!='u') { printf(“%c”,*p-32); p++ ; }
A.language
B.langUAGE
C.LANGUAGE
D.LANG
3.下面能正确进行字符串赋值操作的是( )
A.char s[5]={'A','B','C','D','E'};
B.char s[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.若有说明: int main(int argc,char **argv),则argc的值必须大于1
D.C语言允许main函数带形参,形参名只能是argc和argv
7.若有定义:int (*p)[4];则标识符p( )。
A.是一个指针数组名
B.定义不合法
C.是一个指向整型变量的指针
D.是一个指针,它指向一个含有四个整型元素的一维数组
8.设有程序段:char s[ ]="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.char str[10]={"china"}; 等价于 char str[10]; str[ ]={"china";}
B.char c[4]="abc",d[4]="abc"; 等价于 char c[4]=d[4]="abc" ;
C.char *a="china"; 等价于 char *a; *a="china" ;
D.char *s="china"; 等价于 char *s; s="china" ;
11.设有程序段:char s[ ]=”china”; char *p ; p=s ;则下面叙述正确的是( )
A.数组s中的内容和指针变量p中的内容相等
B.*p与s[0]相等
C.s数组长度和p所指向的字符串长度相等
D.s和p完全相同
12.已有变量定义和函数调用语句:int a=25;print_value(&a);下面函数的输出结果是( )
void print_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.已有定义int k=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应具有下面说明( )。
Int b[10],*a=b;
二、程序设计
1.8885. /*假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:除了字符串前导的*号之外,将串中其他*号全部删除。
在编写函数时,不得使用C语言提供的字符串函数。
例如,若字符串中的内容为****A*BC*DEF*G*******,删除后,字符串中的内容则应当是****ABCDEFG。
注意:部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序: */
#include <string.h>
#include <stdio.h>
void fun (char *a)
{
/************Begin*************/
/************End**************/
}
int main()
{
char s[81];
FILE *in,*out;
int i;
printf("Enter a string :\n");
gets(s);
fun(s);
printf("The string after deleted:\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);
/******************************/
return 0;
}
【参考代码】
int i=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<string.h>
#include<stdio.h>
#define N 80
int fun(char *s)
{
/************Begin*************/
/*************End*************/
}
int main()
{
FILE *wf,*in;
char line[N];
int num=0;
printf("Enter a string:\n ");
gets(line);
num=fun(line);
printf("The number of word is:%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);
/*****************************/
return 0;
}
【参考代码】
int i,j=0;
for(i=0;s[i]!='\0';i++)
if(s[i]!=' '&&(s[i+1]==' '||s[i+1]== '\0'))
/*如果一个字母的下一个字符为空格或者结束标记,则表示一个单词结束*/
j++;
return j;/*返回单词个数*/
3.8860. /*假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:将字符串中的前导*号全部删除,中间和后面的*号不删除。
例如,若字符串中的内容为****A*BC*DEF*G*******,删除后,字符串中的内容则应当是A*BC*DEF*G*******。
注意:部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序: */
#include <stdio.h>
void fun (char *a)
{
/************Begin**************/
/************End*************/
}
int main()
{
FILE *wf,*in;
int i;
char s[81],t[81]="****A*BC*DEF*G*******";
printf("Enter a string :\n");
gets(s);
fun(s);
printf("The string after deleted:\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);
/*****************************/
return 0;
【参考代码】
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 <stdio.h>
#define N 80
int fun(char str[])
{
/***************Begin************/
/*************** End ************/
}
int main()
{
char s[N];
FILE *out,*in;
char test[][80]={"1234321","123421","123321","abcdCBA"};
int i;
printf("Enter a string : ");
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);
/************************************/
return 0;
}
【参考代码】
int fun(char str[])
{
int i,n=0,fg=1,j=0;
while (str[j])
{
n++;
j++;
}
for(i=0;i<n/2;i++)
/*循环比较字符*/
if(str[i]==str[n-1-i]);
/*相同,什么都不作*/
else
/*不同,直接跳出循环*/
{
fg=0;
break;
}
return fg;
}
5.8862. /*请编写函数fun,其功能是:将两个两位数的正整数a、b合并形成一个整数放在c中。
合并的方式是:将a数的十位和个位依次放在c数的千位和十位上,b数的十位和个位依次放在c数的百位和个位上。
例如,当a=45,b=12,调用该项函数后,c=4152。
注意:部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序: */
#include <stdio.h>
#include <conio.h>
void fun(int a ,int b,long *c)
{
/************Begin************/
/************End***************/
}
int main()
{
int a,b,i;
long c;
FILE *out,*in;
printf("Input a ,b: ");
scanf("%d%d",&a,&b);
fun(a,b,&c);
printf("The result is :%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);
/******************************/
return 0;
}
【参考代码】
*c=(a/10)*1000+(b/10)*100+(a%10)*10+b%10;
6.8880. /*请编一个函数fun(char *s),该函数的功能是把字符串中的内容逆置。
例如,字符串中原有的字符串为abcdefg,则调用该函数后,串中的内容为gfedcba。
注意:部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:*/
#include <string.h>
#include <stdio.h>
#define N 81
void fun(char*s)
{
/************Begin*************/
/************End**************/
}
int main()
{
char a[N];
FILE *out,*in;
printf("Enter a string:");
gets(a);
printf("The original string is:");
puts(a);
fun(a);
printf("\n");
printf("The string after modified:");
puts(a);
strcpy(a,"Hello World! This is a first C program!");
fun(a);
/******************************/
in=fopen("in17.dat","r");
fgets(a,81,in);
out=fopen("out17.dat","w");
fprintf(out,"%s",a);
fclose(out);
fclose(in);
/******************************/
return 0;
}
【参考代码】
char ch;
int i,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<conio.h>
#include<stdio.h>
/**********ERROR**********/
void fun(char *s,int a,int b)
{
while(*s)
{
if(*s>='A' && *s<='Z')
/**********ERROR**********/
a++;
if(*s>='a' && *s<='z')
/**********ERROR**********/
b++;
s++;
}
}
int main()
{
char s[100];
int upper=0,lower=0;
printf("\nplease a string :");
gets(s);
fun(s,&upper,&lower);
printf("\n upper=%d lower=%d\n",upper,lower);
return 0;
【改错1】void fun(char *s, int *a, int *b)
【改错2】(*a)++;
【改错3】(*b)++;
2.9332. /*下列给定函数中,函数fun的功能是:统计字符串中各元音字母(即A、E、I、O、U)的个数。注意:字母不分大小写。
例如,输入THIs is a boot,则应输出是1 0 2 2 0。请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序: */
#include <stdio.h>
/**********ERROR**********/
fun(char *s, int num[5])
{ int k, i=5;
for(k=0;k<i;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]++;
}
}
int main()
{ char s1[81]; int num1[5], i;
printf("\nPlease enter a string: ");
gets(s1);
fun(s1, num1);
for(i=0;i<5;i++) printf("%d ",num1[i]);
printf("\n");
return 0;
}
【改错1】void fun(char *s, int num[5])
【改错2】num[k]=0;
【改错3】switch(*s)
3.8876. /*下列给定程序中,函数fun的功能是:计算s所指字符串中含有t所指字符串的数目,并作为函数值返回。
请改正函数fun中的错误或在横线处填上适当的内容并把横线删除,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:*/
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <stdio.h>
#define N 80
int fun(char *s,char *t)
{ int n;
char *p, *r;
n=0;
p=&s[0];
/**********ERROR**********/
*r=t;
while(*p)
{
if(*r==*p)
{
r++;
if(*r=='\0')
{
n++;
/**********ERROR**********/
【1】;
}
}
p++;
}
return n;
}
int main()
{char a[N],b[N]; int m;
system("CLS");
printf("\nPlease enter string a: ");
gets(a);
printf("\nPlease enter substring b: ");
gets(b);
m=fun(a,b);
m=printf("\nThe result is :m=%d\n",m);
return 0;
}
【改错1】r=t;
【改错2】r=t;
4.8853. /*下列给定程序中,函数fun的功能是:从n个学生的成绩中统计出低于平均分的学生人数,此人数由函数值返回,
平均分存放在形参aver所指的存储单元中。例如输入8名学生的成绩:
80.5 60 72 90.5 98 51.5 88 64
则低于平均分的学生人数为4(平均分为75.5625)。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序: */
#include <stdlib.h>
#include <stdio.h>
#define N 20
int fun(float *s, int n,float *aver)
{ float ave ,t=0.0;
int count=0,k,i;
for(k=0;k<n;k++)
/**********ERROR**********/
t=s[k];
ave=t/n;
for(i=0;i<n;i++)
if(s[i]<ave) count++;
/**********ERROR**********/
*aver=&ave;
return count;
}
int main()
{ float s[30],aver;
int m,i;
printf("\nPlease enter m: ");
scanf("%d",&m);
printf("\nPlease enter %d mark :\n",m);
for(i=0;i<m;i++) scanf("%f",s+i);
printf("\nThe number of students :%d\n",fun(s,m,&aver));
printf("Ave=%f\n",aver);
return 0;
}
【改错1】t=t+s[k];
【改错2】*aver=ave;
5.8855. /*给定程序中函数fun的功能是:把主函数中输入的3个数,最大的放在 a中,最小的放在c中,中间的放在b中。
例如,输入的数为:55 12 34,
输出结果应当是:a=55.0 , b=34.0 , c=12.0。
请改正程序中的错误,使它能得出正确结果。
给定源程序:*/
#include <stdio.h>
void fun(float *a,float *b,float *c)
{
/**********ERROR**********/
float *k;
if( *a<*b )
{ k=*a; *a=*b; *b=k; }
/**********ERROR**********/
if( *a>*c )
{ k=*c; *c=*a; *a=k; }
if( *b<*c )
{ k=*b; *b=*c; *c=k; }
}
int main()
{ float a,b,c;
printf("Input a b c: "); scanf("%f%f%f",&a,&b,&c);
printf("a = %4.1f, b = %4.1f, c = %4.1f\n\n",a,b,c);
fun(&a,&b,&c);
printf("a = %4.1f, b = %4.1f, c = %4.1f\n\n",a,b,c);
return 0;
}
【改错1】float k;
【改错2】*a<*c
6.8866. /*下列给定程序中,函数fun的功能是:实现两个整数的交换。例如,给a和b分别输入60和65,输出为:a=65 b=60
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:*/
#include <stdio.h>
#include <stdlib.h>
/**********ERROR**********/
void fun(int a,b)
{ int t;
/**********ERROR**********/
t=b;b=a;a=t;
}
int main()
{int a,b;
printf("Enter a, b: ");
scanf("%d%d",&a,&b);
fun(&a, &b);
printf("a=%d b=%d\n ", a,b);
return 0;
}
【改错1】void fun(int *a,int *b)
【改错2】t=*b;*b=*a;*a=t;
7.8872. /*下列给定的程序中,函数fun的功能是:用选择法对数组中的n个元素按从小到大的顺序进行排序。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序: */
#include <stdio.h>
#define N 20
void fun(int a[],int n)
{int i,j,t,p;
for(j=0;j<n-1;j++)
/**********ERROR**********/
{p=j
for(i=j;i<n;i++)
if(a[i]<a[p])
/**********ERROR**********/
p=j;
t=a[p]; a[p]=a[j]; a[j]=t;
}
}
int main()
{int a[N]={9,6,8,3,-1},i,m=5;
printf("排序前的数据:");
for(i=0;i<m;i++) printf("%d",a[i]);
printf("\n");
fun(a,m);
printf("排序后的顺序:");
for(i=0;i<m;i++) printf("%d",a[i]);
printf("\n");
return 0;
}
【改错1】p=j;
【改错2】p=i;
四、程序填空
1.8887. /*请补充main函数,该函数的功能是:从键盘输入两个字符串并分别保存在字符数组str1和str2中,
用字符串str2替换字符串str1前面的所有字符。注意:str2的长度不大于str1,否则需要重新输入。
例如,如果输入str1="abced",str2="fk",则输出"fkced"。
注意:部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在main函数的横线上填入所编写的若干表达式或语句。
试题程序:*/
#include <stdlib.h>
#include<stdio.h>
#include <string.h>
int main()
{
char str1[81],str2[81];
char *p1=str1,*p2=str2;
do
{
printf(" Input str1 \n");
gets(str1);
printf(" Input str2 \n");
gets(str2);
/**********FILL**********/
}while(【1】);
/**********FILL**********/
while(【2】)
*p1++=*p2++;
printf(" Display str1 \n");
/**********FILL**********/
puts(【3】);
return 0;
}
【空1】strlen(str1)<strlen(str2)
【空2】*p2
【空3】str1
2.8886. /*给定程序中,函数fun的功能是:在形参s所指字符串中的每个数字字符之后插入一个*号。
例如,形参s所指的字符串为:def35adh3kjsdf7。执行结果为:def3*5*adh3*kjsdf7*。
注意:部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。
试题程序:*/
#include <stdio.h>
void fun(char *s )
{
int i,j,n;
for(i=0;s[i]!='\0';i++)
/**********FILL**********/
if(s[i]>='0' [1] s[i]<='9')
{
n=0;
/**********FILL**********/
while(s[i+1+n]!=[2] )
n++;
for(j=i+n+1;j>i;j--)
/**********FILL**********/
s[j+1]= [3] ;
s[j+1]='*';
i=i+1;
}
}
int main()
{
char s[60]="ba3a54cd23a";
printf("\n the original string is: %s\n",s);
fun(s);
printf("\nthe result is: %s\n",s);
return 0;
}
【空1】&&
【空2】0
【空3】s[j]
3.9335. /*请补充函数fun,该函数的功能是:在字符串的最前端加入n个*号,形成新串,并且覆盖。注意:字符串的长度最长允许为79。
注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编若干表达式或语句。
试题程序: */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void fun(char s[],int n)
{
char a[80],*p;
int i;
/**********FILL**********/
p=【1】;
for(i=0;i<n;i++) a[i]= '*';
do
{
/**********FILL**********/
a[i]=【2】;
i++;
/**********FILL**********/
}while(【3】);
a[i]=0;
strcpy(s,a);
}
int main()
{
int n;char s[80];
printf("\nEnter a string: ");gets(s);
printf("\nThe string:%s\n",s);
printf("\nEnter n (number of*):");
scanf("%d",&n);
fun(s,n);
printf("\nThe string after inster:%s\n",s);
return 0;
}
【空1】 p=s;
【空2】a[i]=*p++;
【空3】*p
4.8864. /*请补充main函数,该函数的功能是:从键盘输入若干字符放到一个字符数组中,当按回车键时结束输入,
最后输出这个字符数组中的所有字符。
注意:部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在main函数的横线上填入所编写的若干表达式或语句。
试题程序:*/
#include <stdlib.h>
#include <stdio.h>
int main()
{
int i=0;
char s[81];
char *p=s;
printf(" Input a string \n");
for(i=0;i<80;i++)
{
s[i]=getchar();
if(s[i]=='\n')
/**********FILL**********/
【1】;
}
/**********FILL**********/
s[i]=【2】;
printf(" display the string \n");
while(*p)
/**********FILL**********/
putchar(【3】);
return 0;
}
【空1】break
【空2】0
【空3】*p++
5.8879. /*下面程序是实现两数的交换,如输入5 9,输出9 5。*/
#include<stdio.h>
void swap(int *p1, int *p2);
int main()
{
int a,b;
int *point1,*point2;
/**********FILL**********/
scanf("%d %d", [1] );
point1=&a; point2=&b;
/**********FILL**********/
swap( [2] );
printf("\n%d,%d\n",a,b);
return 0 ;
}
void swap(int *p1, int *p2)
{ int p;
p=*p1;
/**********FILL**********/
[3] ;
*p2=p;
}
【空1】&a,&b
【空2】&a,&b
【空3】*p1=*p2
注:加粗的为正确选项
C语言指针练习题集
这是一篇关于C语言指针的练习题集,包含了选择题和程序设计题,涉及指针的基础操作、字符串处理、函数指针等方面的知识,旨在帮助读者深入理解和掌握C语言中的指针用法。
3699

被折叠的 条评论
为什么被折叠?



