2024年6月15日发(作者:)

指针编程题

1.编写一函数,完成一个字符串的拷贝,要求用字

符指针实现。在主函数中输入任意字符串,并显示原字符串,调用该函数

之后输出拷贝后的字符串。

#include <stdio.h>

void copy(char *pa,char *pb);

int main(void)

{

char a[80],b[80];

printf("Input string:n");

gets(a);

printf("nOldString=%sn",a);

printf("n");

copy(a,b);

printf("nNewString=%sn",b);

return 0;

}

void copy(char *pa,char *pb)

{

while(*pa != '0')

{

*pb=*pa;

pa++;

pb++;

}

*pb='0';

}

2.编写一函数,求一个字符串的长度,要求用字符指针实现。在主函数中

输入字符串,调用该函数输出其长度。

#include <stdio.h>

void MyStrlen(char *pa);

main()

{

char a[80];

printf("please input a:");

gets(a);

MyStrlen(a);

rerurn 0;

}

void MyStrlen(char *pa)

{

int count=0;

while(*pa != '0')

{

pa++;//指向下一位字符

count++;

}

printf("实际字符个数为:%dn",count);

}

3.从键盘上输入10个数据到一维数组中,然后找出数组中的最大值和该值

所在的元素下标。

要求调用子函数search(int *pa,int n,int *pmax,int *pflag)完成,数组名作为

实参,

指针作为形参,最大值和下标在形参中以指针的形式返回。编程素材有

printf("Input 10 numbers:");

和printf("Max is:%dn",...);以及printf("Max position

is:%dn",...)

#include <stdio.h>

int search(int *pa,int n,int *pmax,int *pflag);

int main()

{

int a[10],i,max,flag,pmax;

printf("Input 10 numbers:");

for(i=0;i<10;i++)

scanf("%d",&a[i]);

pmax=search(a,10,&max,&flag);

printf("Max is:%dn",max);

printf("Max position is:%dn",flag);

}

int search(int *pa,int n,int *pmax,int *pflag)

{

int i,*max;

max=pmax;

*pmax=pa[0];

for(i=1;i<n;i++)

{

if(*pmax<pa[i])

{

*pmax=pa[i];

*pflag=i;

}

}

return *max;

}

4.从键盘上输入10个整数存放到一维数组中,将其中最小的数与第一个数

对换,最大的数与最后一个数对换。要求进行数据交换的处理过程编写成

一个函数,函数中对数据的处理要用指针方法实现。编程素材有

printf("Input 10 datas:");和printf("Output 10 datas:");

以及printf("%d ",...);输入数据为:35,20,94,-23,39,

-56,100,87,49,12.

#include <stdio.h>

void swap(int *p1,int *p2);

void fun(int *p);

int main()

{

int a[10],i;

printf("Input 10 datas:");

for(i=0;i<10;i++)

scanf("%d",&a[i]);

fun(a);

}

void swap(int *p1,int *p2)

{

int t;

t=*p1;

*p1=*p2;

*p2=t;

}

void fun(int *pa)

{

int max,min,i,m,n;

max=*pa;

min=*pa;

for(i=1;i<10;i++)

{

if(max<pa[i])

{

max=pa[i];

m=i;

}

if(min>pa[i])

{

min=pa[i];

n=i;

}

}

swap(&pa[0],&pa[n]);

swap(&pa[9],&pa[m]);

printf("Output 10 datas:");

for(i=0;i<10;i++)

printf("%d ",pa[i]);

}

5.编写一个函数(参数用指针)将一个3×3矩阵转置。

#include <stdio.h>

void fun(int (*pa

)[3],int (*pb)[3]);

int main()

{

int a[3][3],i,j,b[3][3]={0};

printf("Please input a:n");

for(i=0;i<3;i++)

for(j=0;j<3;j++)

scanf("%d",&a[i][j]);

fun(a,b);

for(i=0;i<3;i++)

{

for(j=0;j<3;j++)

printf("%dt",b[i][j]);

printf("n");

}

return 0;

}

void fun(int (*pa)[3],int (*pb)[3])

{

int i,j;

for(i=0;i<3;i++)

for(j=0;j<3;j++)

pb[j][i]=pa[i][j];

}

6.利用指向行的指针变量求5×3数组各行元素之和

#include <stdio.h>

void fun(int (*p)[3]);

int main()

{

int a[5][3],i,j;

printf("请输入5*3矩阵a:n");

for(i=0;i<5;i++)

for(j=0;j<3;j++)

scanf("%d",&a[i][j]);

fun(a);

return 0;

}

void fun(int (*p)[3])

{

int i,j,sum=0;

for(i=0;i<5;i++)

{

printf("第%d行元素之和为:",i+1);

for(j=0;j<3;j++)

sum+=p[i][j];

printf("%dn",sum);

sum=0;

}

}

7.从键盘上输入10个整数存放到一维数组中,用函数实现将10个整数按

输入时的顺序逆序排列,函数中对数据的处理要用指针方法实现。

#include <stdio.h>

void fun(int *pa,int t);

int main()

{

int a[10],i;

printf("Input 10 numbers:");

for(i=0;i<10;i++)

scanf("%d",&a[i]);

fun(a,10);

return 0;

}

void fun(int *pa,int t)

{

int i;

printf("Output 10 numbers:");

for(i=t-1;i>=0;i--)

printf("%d ",pa[i]);

}

8.用指针法编程,从键盘上输入多个字符串(每个串不超过5个字符且没

有空格),用”*****”作为输入结束的标记。从所输入的若干字符串中,

找出一个最大的串,并输出该串。要求串的输入以及最大串的查找通过调

用编写的函数实现。编程素材有printf("****Input

strings****n");和 printf("max=%sn",...);输入内容为hello

apple zone world *****。

#include <stdio.h>

#include <string.h>

void find(char *name[],int n,int *p)

{

int i,m = 0;

char *pmax = name[0];

for(i = 1;i < n;i++)

{

if(strcmp(pmax,name[i]) < 0)

{

strcpy(pmax,name[i]);

m = i;

}

}

*p = m;

}

int main(void)

{

char *str[100];

char a[100][6];

int i = 0,max;

printf("****Input strings****n");

do

{

str[i] = a[i];

scanf("%s",str[i]);

i++;

}while(strcmp(str[i-1],"*****") != 0);

find(str,i,&max);

printf("max=%sn",str[max]);

return 0;

}

9.在主函数中输入5个字符串(每个字符串的长度不大于20),并输出这5

个字符串。编写一个排序函数,完成对这些字符串按照字典顺序排序。然

后在主函数中调用该排序函数,并输出这5个已排好序的字符串。要求用

指针数组处理这些字符串。编程素材有printf("*****Input 5

strings******n");

Before******n");以

printf("n******Sort

printf("n******Sort

me,BASIC,Great After******n");输入内容为:Follow

Wall,FORTRAN,Computer design。

#include <stdio.h>

#include <string.h>

void fun(char *pa[20]);

int main()

{

char a[5][20],*p[5];

int i;

printf("*****Input 5 strings******n");

for(i=0;i<5;i++)

gets(a[

i]);

for(i=0;i<5;i++)

p[i]=a[i];

printf("n******Sort Before******n");

for(i=0;i<5;i++)

puts(a[i]);

printf("n******Sort After******n");

fun(p);

for(i=0;i<5;i++)

puts(p[i]);

return 0;

}

void fun(char *pa[20])

{

int i,j;

char *temp=NULL;

for(i=0;i<4;i++)

for(j=i+1;j<5;j++)

{

if(strcmp(pa[j],pa[i])<0)

{

temp=pa[i];

pa[i]=pa[j];

pa[j]=temp;

}

}

}

10.找出一个2×3的矩阵中的最大值及其行下标和列下标,要求调用子函

数FindMax(int p[][3], int m, int n, int *pRow, int *pCol)实现,最大值以函数的

返回值得到,行下标和列下标在形参中以指针的形式返回。编程素材有

printf("Input 6 datas:");printf("n****array****n");

和printf("%4d",...);以及printf("nMax=%d, Row=%d,

Col=%dn",...);输入内容为:12,23,10,11,19,17.

#include <stdio.h>

int FindMax(int p[][3], int m, int n, int *pRow, int *pCol);

int main()

{

int a[2][3],i,j,row,col,max;

printf("Input 6 datas:");

for(i=0;i<2;i++)

for(j=0;j<3;j++)

scanf("%d",&a[i][j]);

printf("n****array****n");

for(i=0;i<2;i++)

{

for(j=0;j<3;j++)

printf("%4d",a[i][j]);

printf("n");

}

max=FindMax(a,2,3,&row,&col);

printf("nMax=%d, Row=%d, Col=%dn",max,row,col);

}

int FindMax(int p[][3], int m, int n, int *pRow, int *pCol)

{

int *max,i,j;

max=p[0];

*pRow=0;

*pCol=0;

for(i=0;i<m;i++)

for(j=0;j<n;j++)

{

if(*max<p[i][j])

{

*max=p[i][j];

*pRow=i;

*pCol=j;

}

}

return (*max);

}

11.从键盘上先后读入两个字符串,假定存储在字符数组s1和s2中。注意,

这两个字符串最长均可达到26个字符、最短均可为0个字符。将字符串

s2插入字符串s1中,生成一个新的字符串s。插入方法为s2的第i个字符

插入到原s1的第i个字符后,如果s2比s1(假定s1的长度为L1)长,则s2

的第L1个字符开始到s2结尾的所有字符按在s2中的顺序放在新生成的字

符串s之后。用指针完成程序。程序的运行效果应类似地如下图所示。编

程素材printf("please input strings1:"); printf("please input

strings2:");和printf("result are:%sn",……);图中的acegi和

bdfhjklmn分别是从键盘输入的字符串。

法1:

#include <stdio.h>

#include <string.h>

int main()

{

int i;

char s1[27], s2[27], s3[27];

char *p1=s1,*p2=s2,*p3=s3;

gets(s1);

gets(s2);

i = 0;

while (*(p1+i) != '0' && *(p2+i) != '0')

{

p3[2 * i] = p1[i];

p3[2 * i + 1] = p2[i];

i++;

}

p3[2 * i] = '0';

if (p1[i] == '0')

{

strcat(p3, (p2+i));

}

else

{

strcat(p3, (p1+i));

}

printf("%sn", s3);

}

法2:

#include<stdio.h>

main()

{

void Hebin(char *s1,char *s2);

char s1[26],s2[26];

printf("Please enter a s1:");

scanf("%s",s1);

printf("Please enter a s2:");

scanf("%s",s2);

Hebin(s1,s2);

printf("Result is %s:n",s1);

}

void Hebin(char *s1,char *s2)

{

char s[54];

int i=0,j,k;

while((s[i]=s

1[i])!='0')

{

i++;

}

i=0;

j=0;

k=0;

while(s1[i]!=0||s2[j]!=0)

{

if(s1[i]!=0)

s1[k++]=s[i++];

if(s2[j]!=0)

s1[k++]=s2[j++];

}

s1[k]='0';

}

12.编写一个函数,函数的功能是移动字符串中的内容。移动的规则如下:

把第1到第m个字符,平移到字符串的最后;再把第m+1到最后的字符

移动到字符串的前部。例如,字符串中原由的内容为:ABCDEFGHIJK,m

的值为3,则移动后,字符串中的内容应该是DEFGHIJKABC。在主函数中

输入一个长度不大于20的字符串和平移的值m,调用函数完成字符串的

平移。要求用指针方法处理字符串。编程素材有printf("Please input a

strings:");和printf("Please input intercept point:");以及

printf("Changed strings:%sn",...);输入内容为:ABCDEFGHIJK,3

法1:

#include <stdio.h>

#include <string.h>

void fun(char *pstr,int n);

int main()

{

char str[20];

int m;

printf("Please input a strings:");

gets(str);

printf("Please input intercept point:");

scanf("%d",&m);

fun(str,m);

return 0;

}

void fun(char *pstr,int n)

{

int i,x,count=0;

char b[20];

x=strlen(pstr);

for(i=n;i<x;i++)

{

b[count]=pstr[i];

count++;

}

for(i=0;i<n;i++)

{

b[count]=pstr[i];

count++;

}

b[count]='0';

printf("Changed strings:%sn",b);

}

法2:

#include <stdio.h>

#include <string.h>

void fun(char *pstr,int n);

int main()

{

char str[20];

int m;

printf("Please input a strings:");

gets(str);

printf("Please input intercept point:");

scanf("%d",&m);

fun(str,m);

return 0;

}

void fun(char *pstr,int n)

{

int i,x;

x=strlen(pstr);

printf("Changed strings:");

for(i=n;i<x;i++)

printf("%c",pstr[i]);

for(i=0;i<n;i++)

printf("%c",pstr[i]);

printf("n");

}

13.编写一个函数,用于统计一个字符串中字母、数字、空格的个数。在主

函数中输入该字符串后,调用上述函数,并输出统计结果。要求用指针实

现。编程素材有printf("Input a sring:");和printf("Result

is:char=%d,num=%d,space=%dn",...);

vdhfvsh345#%^$$%^456 5678%Ss s

#include <stdio.h>

#include <string.h>

void fun(char *p,int m);

int main()

{

char a[80];

int n;

printf("Input a sring:");

输入内容为:

fgets(a,sizeof(a),stdin);

n=strlen(a);

fun(a,n);

return 0;

}

void fun(char *p,int m)

{

int i,p1=0,p2=0,p3=0;

for(i=0;i<m;i++)

{

if(p[i]>='0' && p[i]<='9')

p1++;

if(p[i]>='A'

p[i]<='Z'||p[i]>='a'

p[i]<='z')

p2++;

if(p[i]==' ')

p3++;

}

printf("Result is:char=%d,num=%d,space=%dn",p2,p1,p3);

}

&&

&&

14.输入一个长度不大于30的字符串,将此字符串中从第m个字符开始的

剩余全部字符复制成为另一个字符串,并将这个新字符串输出。要求用指

针方法处理字符串。

#include <stdio.h>

#include <string.h>

void fun(char *pa,int n,int y);

int main()

{

char a[30];

int m,x;

printf("Input a string:");

fg

ets(a,sizeof(a),stdin);

x=strlen(a);

printf("Input a position:");

scanf("%d",&m);

fun(a,m,x);

}

void fun(char *pa,int n,int y)

{

char b[30];

int i,count=0;

for(i=n-1;i<y-1;i++)

{

b[count]=pa[i];

count++;

}

b[count]='0';

printf("Output new string:");

puts(b);

}