|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
编写一个函数实现两个字符串a,b的复制(a-->b)、连接(a&b-->a)、交换功能(a<-->b), 要求:函数名是strchang;使用指针作为参数;使用int flag表示实现的功能,但值为1时实现复制,2时实现连接,3时实现交换。各功能函数不得直接使用库函数,必须自己编写
c语言作业,但是写了好久什么也不懂,以下是自己的理解
#include<stdio.h>
#include<math.h>
int flag(int x,int y,int (*p)()) ;
char strchang(int i) ;
main()
{
char a[3]={"a","b","c"} , b[3]={"d","e","f"} , *p_a , *p_b ;
int i ;
p_a=a ;
p_b=b ;
printf("Please input a number:\n") ;
scanf("%d\n",i) ;
printf("%d",flag(*p_a,*p_b,strchang)) ;
}
char strchang(int i)
{
char *p_a , *p_b ;
if(i==1)
{
for(;*p_a!='\0';p_a++,p_b++)
*p_b=*p_a;
*p_b='\0';
return(*p_b) ;
}
if(i==2)
{
while(*p_a)
p_a++;
for(;*p_b!='\0';p_a++,p_b++)
*p_a=*p_b ;
return(*p_a) ;
}
if(i==3)
{
char tmp ;
for(;*p_a!='\0';p_a++,p_b++)
{
tmp=*p_a ;
*p_a=*p_b ;
*p_b=tmp ;
}
return(*p_a,*p_b) ;
}
}
int flag(int x,int y,int (*p)()) /* 实现了不同函数的调用 */
{
return (*p)(x,y);
}
本帖最后由 ba21 于 2019-6-2 13:31 编辑
先给你指几个明显的错误
然后参考代码: 你也可以用指针函数,强调代码只用作参考 #include<stdio.h>
#include<stdlib.h>
int strlen(char *s);
int strchang(char **p1, char **p2, int flag);
int main(void)
{
char a[]="abc" , b[]="def"; // 依据题意是字符串(不是字符数组,2者还是有区别的),或 char a[3]={'a', 'b', 'c', '\0'}
char *p_a , *p_b ;
int flag;
int nFlag; // 多声明个nFlag,用来接收strchang的返回值,作用是用来释放手动malloc申请的内存,这很有必要
p_a = a;
p_b = b;
printf("Please input a number:\n");
scanf("%d", &flag);
nFlag = strchang(&p_a, &p_b, flag); // 应该是p_a, 加*就是取该指针指向的值了;我这里加&是因为我里面要修改指针里面存放的地址,故加&;返回值在p_a中
printf("%s\n", p_a);
// 释放函数里面手动申请的内存
if(nFlag)
{
free(p_a);
p_a = NULL;
}
return 0;
}
int strlen(char *s)
{
int i;
i = 0;
while(*s != '\0')
{
s++;
i++;
}
return i;
}
int strchang(char **p1, char **p2, int flag)
{
char *tmp1, *tmp2, *p, *tmp_p;
int len;
tmp1 = *p1; // 指向字符串
tmp2 = *p2;
switch(flag)
{
case 1:
// 复制(a-->b), 以tmp1的长度为标准
while(!(*tmp1 == '\0' || *tmp2 == '\0')) // 此处为什么不用 while 要用for,明显就是while比效好
{
*tmp2 = *tmp1;
tmp1++;
tmp2++;
}
// 修改p1的地址
*p1 = *p2;
return 0;
case 2:
// 连接(a&b-->a)
len = strlen(tmp1)+strlen(tmp2);
p = (char *)malloc(sizeof(char) * (len + 1));
if (p == NULL)
{
printf("分配空间失败!");
exit (1);
}
tmp_p = p; // tmp_p作用是用来移动指针p,这样p就不用移动了,还是原来的地址
while(*tmp1 != '\0') // 复制tmp1 到 tmp_p
{
*tmp_p = *tmp1;
tmp1++;
tmp_p++;
}
while(*tmp2 != '\0') // 复制tmp2 到 tmp_p
{
*tmp_p = *tmp2;
tmp2++;
tmp_p++;
}
// 别忘了加 '\0'
*tmp_p = '\0';
*p1 = p; // 最后修改p1的地址
return 1;
case 3:
// 交换功能(a<-->b)
// 直接交换地址即可
p = *p1;
*p1 = *p2;
*p2 = p;
return 0;
}
return 0;
}
|
|