6 指针 - 参考程序

更新时间:2023-09-25 03:09:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

指针参考程序

编程题:

1. 编写程序,用指针实现读入一行数列,求数列的和,平均值,最大值、最小值,并且打印它们。

#include \#include \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(\

printf(\请输入%d个整数\ p=array; for(i=0; i

scanf(\ if(*p>max) max= *p; if(*p

sum=sum + *p; p++; }

printf(\输入的%d个整数为\输出所有整数*/ p=array;

for(i=0; i

printf(\ putchar('\\n');

printf(\以上整数的累加和为%d\\n\ printf(\以上整数的平均值为%.2f\\n\ printf(\以上整数的最大值为%d\\n\ printf(\以上整数的最小值为%d\\n\

}

2. 编写字符串插入函数char *strins(char *s1, char *s2),将字符串s2的内容插入到字

符串s1之前,参数s1, s2为指向字符串的指针。函数执行后,返回值为结果字符串的首地址(即s1),参数s1为结果字符串中原来子串s1的首地址,参数s2不变。例如:s1=”world”, s2=”hello”, 结果字符串为”helloworld”,s1指向字符‘h’。

在main函数中输入两个字符串,调用该函数完成字符串的插入,并输出结果。

#include \

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+len1; //指向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(\ gets(str1);

printf(\ 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中首次出现子串str2的起始位置,否则,返回NULL值。例如:str1=”I am a student”,str2=”stu”,函数执行后,返回值指向字符‘s’,参数s1, s2不变。

在main函数中输入两个字符串,调用该函数判断第二个字符串是否为第一个字符串的子串,并输出结果。

#include

char *substr(char *str1, char *str2);

void main() {

char s1[80], s2[20], *p;

printf(\ gets(s1);

printf(\

gets(s2); /*s2为要验证的字串*/

p=substr(s1, s2); if (p!=NULL) {

printf(\第二个字符串是第一个字符串的子串!\\n\ printf(\指针指向字符%c!\\n\} else

printf(\第二个字符串不是第一个字符串的子串,p为空指针!\\n\}

char *substr(char *str1, char *str2) {

char *p, *q, *s;

for(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; /*是子串, 返回指向第一个字符的指针*/ } }

return NULL; /*没有匹配的字符串,返回空指针*/ }

4. 编写字符串函数int lenstr(char *str),求字符串str的长度。

在main函数中输入一个字符串,调用该函数计算字符串的长度,并输出结果。

#include int lenstr(char *str);

void main() {

char s[80];

printf(\请输入一个字符串以回车结束:\\n\gets(s);

printf(\该字符串的长度为%d\\n\}

int lenstr(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个字符删除,后续字符前移,并输出结果。

#include #include \

char * cutstr(char *str, unsigned int n);

void main() {

char s[80], *p; unsigned int n;

printf(\请输入一个字符串以回车结束:\\n\gets(s);

printf(\请输入要删除前面的字符个数: \scanf(\

p=cutstr(s,n);

printf(\删除前面%d个字符后字符串为:%s\\n\这里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,将数组按照从大到小的顺序排序,其中有两个形式参数,一个为指向数组的指针p,另一个为数组的元素个数n。

在main函数中输入10个整数存入数组data[10]中,调用该函数对data进行排序,并输出最后的排序结果。

#include \

void sort(int *a, int n) //无返回值,在原数组上排序 {

int i, j, temp;

for(i=0;i

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(\

sort(data, 10);

printf(\降序排序后的数组为:\\n\ for(i=0;i<10;i++)

printf(\ printf(\}

选做题:

编写程序,用指针实现读入字符串s,字符串s1,字符串s2,如果s1是字符串s的子串,则用s2替换s中的s1,并且打印结果字符串。例如s=”abcde123fghijk123mn45”, s1=”123”, s2=”88”, 程序执行后s=”abcde88fghijk88mn45”

#include #include

//利用前面设计的函数

//char *strins(char *s1, char *s2) 将字符串s2的内容插入到字符串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=s2;

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 * 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; 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); }

本文来源:https://www.bwwdw.com/article/61kd.html

Top