0%

指针练习题

指针练习题(实验10)

基础

5 、编写一个函数,判断任意输入的字符串中,有多少个字母。建议函数原型: int CountNumofLetter(char *string) ;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include "stdio.h"
#include "string.h"
int CountNumofLetter(char *string);
int main()
{
char zfc1[]="Everyday*)^&(^i?a{}new one!";
char zfc2[]="fsiayud^&(%^*$%*$";
char *p1,*p2;
p1=zfc1;p2=zfc2;
printf("\"%s\"中字母的个数为:%d\n",zfc1,CountNumofLetter(p1));
printf("\"%s\"中字母的个数为:%d\n",zfc2,CountNumofLetter(p2));


}

int CountNumofLetter(char *string){
int geshu=0;
unsigned long i=0;
for (i=0; i<strlen(string)-1; i++) {
if ((*(string+i)>='A'&&*(string+i)<='Z')||(*(string+i)>='a'&&*(string+i)<='z')) {
geshu++;
}
}
return geshu;
}
/*输出结果为:
"Everyday*)^&(^i?a{}new one!"中字母的个数为:16
"fsiayud^&(%^*$%*$"中字母的个数为:7
*/

进阶

1 、如下函数: strcpy(char *to , char *from) 将字符串from复制到字符串 to. 将函数补充完整并实 现在主程序中的调用。void strcpy(char *to ,char *from) {while (____) ; }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "stdio.h"
#include "string.h"
void str_cpy(char *to,char *from){//因为strcpy会发生冲突,所以中间加了下划线区分
while (*from!='\0') {//执行循环知道from字符串末尾
*to=*from;
to++;from++; //to和from指针依次递增l;
}
}
int main()
{
char yuanshi[]="Today is a good day!";
char gengxin[]="";
char *p1,*p2; //定义两个字符型指针
p1=yuanshi;p2=gengxin;//字符型指针分别指向两个字符数组的首地址
str_cpy(gengxin, yuanshi);//调用str_cpy函数
unsigned i=0;
for (i=0; i<=strlen(gengxin)-1; i++) {//执行循环,输出新的字符串
printf("%c",*(p2+i));
}
}
/*输出结果为:
Today is a good day!
*/

2 、如下函数: merge(int a[] , int n , int b[] , int m , int *c) 是将两个从小到大有序数组, a 和 b 复制合并出一个有序整数序列 c ,其中形参 n 和 m 分别是数组 a 和 b 的元素个数 . 将函数补充完整并实现在主程序中的调用。

原代码:

1
2
3
4
5
void merge(int a[] ,int n, int b[] , int m , int *c) {
int i , j ;
for (i=j=0; i<n&&j<m ; ) *c++=a[i]<b[j]?a[i++]:b[j++];
while (____________) *c++=a[i++] ;
while (____________) *c++=b[j++] ; }

答案为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include "stdio.h"
#include "string.h"
void merge(int a[],int n,int b[],int m,int *c){
int i,j;
for (i=j=0; i<n&&j<m;){
*c++=a[i]<b[j]?a[i++]:b[j++];}
while (i<n){*c++=a[i++];}
while (j<m){*c++=b[j++];}
}
int main()
{ int n=5,m=3;//测试1
int numbers1[]={21,23,24,25,26};
int numbers2[]={12,13,20};
int numbers3[8];
merge(numbers1, n, numbers2, m, numbers3);
for (int i=0; i<(m+n); i++) {
printf("%d ",numbers3[i]);
}
printf("\n");
n=5;m=5;//测试2
int numbers4[5]={1,3,4,8,10};
int numbers5[5]={-12,-10,22,100,10000};
int numbers6[10],*p=numbers6;
merge(numbers4, n, numbers5, m, p);
for (int i=0; i<(m+n); i++) {
printf("%d ",p[i]);
}
}
/*输出结果:
12 13 20 21 23 24 25 26
-12 -10 1 3 4 8 10 22 100 10000 Program ended with exit code: 0
*/

3 、有一字符串,包含n(n<=1024)个字符,写一函数,将此字符串中从第m个字符开始的全部字符 复制成为另一个字符串。建议函数原型:void Mystrcpy(char *src, char *des, int m) ;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//实验10 进阶3/
#include "stdio.h"
#include "string.h"
void Mystrcpy(char *src,char *des,int m);
int main()
{ //测试1
char yuanshi[]="abcdefghijk";
char gengxin[]="";
int m=3;
char *p1;
p1=yuanshi;
char *p2=gengxin;
Mystrcpy(p1,p2, m);
//测试2
char yuanshi1[]="The joy of living never comes to the frivolous,the superficial,the selfish.";
char gengxin2[]="";
int n=5;
char *p3,*p4;
p3=yuanshi1;p4=gengxin2;
Mystrcpy(p3, p4, n);



}
void Mystrcpy(char *src,char *des,int m)
{ char *p3;
p3=&src[m-1];
int i=0;
for (i=0; i<strlen(p3)+1; i++) {
*(des+i)=*(p3+i);
}
printf("%s\n",des);
}
/*输出结果为:
cdefghijk
joy of living never comes to the frivolous,the superficial,the selfish.
*/

6 、定义一个具有n(n<=1024)个元素的一维整型数组,编写函数,将其中最小的数与第一个数对换。 建议函数原型:void MinChange(int *data ,int len);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//实验10 进阶6/
#include "stdio.h"
#include "string.h"
void MinChange(int *data ,int len);//函数声明
int main()
{ //测试1
int num[]={1,23,32,-29,4,4};
int len=sizeof(num)/sizeof(int);//获取整型数组的长度
MinChange(num, len); //函数调用
//测试2
int num1[]={0,5*2,-1*10,234,25*25};
len=sizeof(num1)/sizeof(int);
MinChange(num1, len);
}
void MinChange(int *data ,int len){
int i=0,j=0,mix=data[0],exchange;
for (i=0; i<len; i++) {//执行循环m,找到最小数和它的下标
if (mix>data[i]) {
mix=data[i];
j=i;
}
}
exchange=data[0]; //交换最小数和第一个数
data[0]=mix;
data[j]=exchange;
for (i=0; i<len; i++) {//循环输出数组
printf("%d ",data[i]);
}
printf("\n");
}
/*输出结果是:
-29 23 32 1 4 4
-10 10 0 234 625
*/

14、编程实现字符串比较函数: int MyStrcmp(char *p1,char *p2)。其中,p1和p2分别指向两个字符 串,如果这两个字符串相当则函数返回 0 ,如果这两个字符串不相等则返回二者第一个不同字符的ASCII 差值。例如:“asd”和“ awe” 第二个字符不同,则返回:’s’-‘w’=115-119 = -4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include "stdio.h"
#include "string.h"
int MyStrcmp(char *p1,char *p2);
int main()
{ //测试1
char zf1[]="When love beckons you,follow him,though this way are hard and steep.";
char zf2[]="When love beckons you,follow him,though this way are hard and steeps.";
char *p1=zf1,*p2=zf2;
printf("The results is:%d\n",MyStrcmp(p1, p2));//调用函数并输出返回值
//测试2
char zf3[]="abcdefghigkl";
char zf4[]="abcdefghigkl";
char *p3=zf3,*p4=zf4;
printf("The results is:%d\n",MyStrcmp(p3, p4));


}

int MyStrcmp(char *p1,char *p2){
int i=0,jieguo=0;
unsigned long changdu=strlen(p1);//获取字符数组的长度,这里选择p1和p2都是一样的,因为若两个字符数组相同的话长度肯定是一样的
for (i=0; i<changdu; i++) {//循环判断每一个字符是否相等
if (p1[i]==p2[i]) {//如果相等,就让jieguo的值一直为0,这样是为了方便函数返回
jieguo=0;
}
else{
jieguo=p1[i]-p2[i];//如果不相等,就让jieguo=两个zifu的ASCII码的差值
break;//并且r退出循环
}
}

return jieguo;
}
/*输出结果是:
The results is:-69
The results is:0
*/