鱼C论坛

 找回密码
 立即注册
查看: 1236|回复: 4

[已解决]新手c指针求助

[复制链接]
发表于 2019-6-2 11:14:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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);  
}   
最佳答案
2019-6-2 13:23:27
本帖最后由 ba21 于 2019-6-2 13:31 编辑

先给你指几个明显的错误
201962_132251.png




然后参考代码: 你也可以用指针函数,强调代码只用作参考
#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;
   
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-6-2 11:23:05 From FishC Mobile | 显示全部楼层
我建议你去百度一下strcat()和strcpy()的源代码作为参考
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-2 11:36:44 | 显示全部楼层
bin554385863 发表于 2019-6-2 11:23
我建议你去百度一下strcat()和strcpy()的源代码作为参考

好的谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-2 13:23:27 | 显示全部楼层    本楼为最佳答案   
本帖最后由 ba21 于 2019-6-2 13:31 编辑

先给你指几个明显的错误
201962_132251.png




然后参考代码: 你也可以用指针函数,强调代码只用作参考
#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;
   
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-2 14:17:58 | 显示全部楼层
ba21 发表于 2019-6-2 13:23
先给你指几个明显的错误

谢谢指导
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-3 19:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表