1、指针参考程序 编程题: 1、 编写程序,用指针实现读入一行数列,求数列得与,平均值,最大值、最小值,并且打印它们。 #include "stdio、h" #include "limits、h" void main() { int array[80], *p; int n, i, sum=0, max=INT_MIN, min=INT_MAX; /*符号常量INT_MIN与INT_MAX分别表示int型得最小值与最大值,在limits、h中定义*/ printf("请确定要输入得整数个数n "); scanf("%d",&n); printf("请输入
2、d个整数", n);
p=array;
for(i=0; i 3、 sum);
printf("以上整数得平均值为%、2f\n", (float)sum/n);
printf("以上整数得最大值为%d\n", max);
printf("以上整数得最小值为%d\n", min);
}
2、 编写字符串插入函数char *strins(char *s1, char *s2),将字符串s2得内容插入到字符串s1之前,参数s1, s2为指向字符串得指针。函数执行后,返回值为结果字符串得首地址(即s1),参数s1为结果字符串中原来子串s1得首地址,参数s2不变。例如:s1=”world”, s2=”hello”, 结果字符串为”helloworld” 4、s1指向字符‘h’。
在main函数中输入两个字符串,调用该函数完成字符串得插入,并输出结果。
#include "stdio、h"
char *strins(char *s1, char *s2)
{
int len1=0, len2=0;
char *p1, *p2;
p1=s1;
while(*p1++) //计算s1得长度
len1++;
p2=s2;
while(*p2++) //计算s2得长度
len2++;
//把s1中得每个字符顺次向后移动len2个位置,包括结束符'\0'
p1=s1+l 5、en1; //指向s1得结束符'\0'
do {
*(p1+len2)= *p1;
} while(p1--!=s1); /*至少要移动一次,因此用do~while循环*/
//把s2拷贝插入到s1得前面
p1=s1;
p2=s2;
while(*p2)
*p1++=*p2++;
return s1;
}
void main()
{
char str1[80],str2[80], *p;
printf("input first string:");
gets(str1);
print 6、f("input second string:");
gets(str2);
printf("原来得字串s1:");
puts(str1);
p=strins(str1,str2);
printf("插入后得字符串:");
puts(str1);
/*这里puts(str1)与puts(p)得输出结果一样,因为p指针实际上就就是指向str1得第一个元素*/
puts(p);
}
3、 编写字符串函数char *substr(char *str1, char *str2),判断字符串str2就是否为str1得子串,如果就是,则返回str1中首次出现子 7、串str2得起始位置,否则,返回NULL值。例如:str1=”I am a student”,str2=”stu”,函数执行后,返回值指向字符‘s’,参数s1, s2不变。
在main函数中输入两个字符串,调用该函数判断第二个字符串就是否为第一个字符串得子串,并输出结果。
#include 8、nput string2:\n");
gets(s2); /*s2为要验证得字串*/
p=substr(s1, s2);
if (p!=NULL)
{
printf("\n第二个字符串就是第一个字符串得子串!\n");
printf("p指针指向字符%c!\n", *p);
}
else
printf("\n第二个字符串不就是第一个字符串得子串,p为空指针!\n");
}
char *substr(char *str1, char *str2)
{
char *p, *q, *s;
f 9、or(s=str1; *s !='\0' ; s++)
{
if (*s == *str2) /*str1中就是否有与str2首字符相同得字符*/
{
for(p=s, q=str2; *p && *q ; p++, q++) /*判断接下去得几个字符就是否相同*/
{
if (*p != *q) /*不相同*/
break;
}
if (*q=='\0') /*所有字符都相同*/
return s; /*就是子串, 返回指向第一个字符得指针*/
10、 }
}
return NULL; /*没有匹配得字符串,返回空指针*/
}
4、 编写字符串函数int lenstr(char *str),求字符串str得长度。
在main函数中输入一个字符串,调用该函数计算字符串得长度,并输出结果。
#include 11、char *str)
{
char *p;
int len=0;
for(p=str; *p ; p++)
len++;
return len;
}
5、 编写字符串函数char * cutstr(char *str, int n),将字符串str中前面得n个字符删除,后续字符前移。函数执行后,参数str,n不变,如果成功,返回值为str首地址,如果未成功,返回值为NULL。例如:str=”I am a student”,n=2,函数执行后str=”am a student”。
在main函数中输入一个字符串与一个正整数n,调用该函数将字符串前面得n个字符删除 12、后续字符前移,并输出结果。
#include 13、 //这里p用s替代结果一样
}
char * cutstr(char *str, unsigned int n)
{
char *p;
if( strlen(str) < n ) /*要删除得字符数大于字符串中实际字符个数*/
*str='\0';
else
{
for(p=str+n; *p; p++) /*后续字符前移*/
*(p-n)=*p;
*(p-n)='\0'; /*串结束标志*/
}
return str;
}
6、 编写一个排序函数sort,将数组按照从大到小得顺序 14、排序,其中有两个形式参数,一个为指向数组得指针p,另一个为数组得元素个数n。
在main函数中输入10个整数存入数组data[10]中,调用该函数对data进行排序,并输出最后得排序结果。
#include "stdio、h"
void sort(int *a, int n) //无返回值,在原数组上排序
{
int i, j, temp;
for(i=0;i 15、 temp = *(a+j);
*(a+j) = *(a+j+1);
*(a+j+1) = temp;
}
}
void main(void)
{
int data[10];
int i;
printf("请输入10个整数:\n");
for(i=0;i<10;i++)
scanf("%d",&data[i]);
sort(data, 10);
printf("降序排序后得数组为:\n");
for(i=0;i<10;i++)
16、 printf("%d ", data[i]);
printf("\n");
}
选做题:
编写程序,用指针实现读入字符串s,字符串s1,字符串s2,如果s1就是字符串s得子串,则用s2替换s中得s1,并且打印结果字符串。例如s=”abcde123fghijk123mn45”, s1=”123”, s2=”88”, 程序执行后s=”abcde88fghijk88mn45”
#include 17、容插入到字符串s1之前
//char * cutstr(char *str, int n),将字符串str中前面得n个字符删除,后续字符前移
//以及c库函数 char *strstr(char *s1, char *s2) 从字符串s1中寻找子串s2第一次出现得位置,返回指向第一次出现s2得指针,如果没找到返回NULL
char *strins(char *s1, char *s2)
{
int len1=0, len2=0;
char *p1, *p2;
p1=s1;
while(*p1++) //计算s1得长度
len1++;
p2=s 18、2;
while(*p2++) //计算s2得长度
len2++;
//把s1中得每个字符顺次向后移动len2个位置,包括结束符'\0'
p1=s1+len1; //指向s1得结束符'\0'
do {
*(p1+len2)= *p1;
} while(p1--!=s1); /*至少要移动一次,因此用do~while循环*/
//把s2拷贝插入到s1得前面
p1=s1;
p2=s2;
while(*p2)
*p1++=*p2++;
return s1;
}
char 19、 cutstr(char *str, unsigned int n)
{
char *p;
if( strlen(str) < n ) /*要删除得字符数大于字符串中实际字符个数*/
*str='\0';
else
{
for(p=str+n; *p; p++) /*后续字符前移*/
*(p-n)=*p;
*(p-n)='\0'; /*串结束标志*/
}
return str;
}
void main()
{
char s1[80], s2[20], s3[20], *p, *q; 20、
unsigned int len2, len3;
puts("请输入字符串s1以回车结束: ");
gets(s1);
puts("请输入字符串s2以回车结束: ");
gets(s2);
puts("请输入字符串s3以回车结束: ");
gets(s3);
len2=strlen(s2);
len3=strlen(s3);
q=s1;
do
{
p=strstr(q,s2); //在q指向得字符串中查找s2第一次出现得位置
if(p!=NULL) //s2就是q得子串,此时p指向该子串第一次出现得位置
{
//用s3替换s2
cutstr(p, len2); //删除p指针开始得子串s2
strins(p, s3) ; //将s3插入p指针指定得位置
}
q = p + len3; //继续查找
}while(p!=NULL); //直到q指向得串中没有能够匹配得子串
printf("用字符串s3替换掉子串s2后新得s1串为\n");
puts(s1);
}






