JHZRYS 发表于 2019-6-2 11:14:59

新手c指针求助

编写一个函数实现两个字符串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={"a","b","c"} , b={"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);
}   

bin554385863 发表于 2019-6-2 11:23:05

我建议你去百度一下strcat()和strcpy()的源代码作为参考

JHZRYS 发表于 2019-6-2 11:36:44

bin554385863 发表于 2019-6-2 11:23
我建议你去百度一下strcat()和strcpy()的源代码作为参考

好的谢谢

ba21 发表于 2019-6-2 13:23:27

本帖最后由 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={'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;
   
}

JHZRYS 发表于 2019-6-2 14:17:58

ba21 发表于 2019-6-2 13:23
先给你指几个明显的错误




{:5_106:}谢谢指导
页: [1]
查看完整版本: 新手c指针求助