鱼C论坛

 找回密码
 立即注册
查看: 1687|回复: 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




然后参考代码: 你也可以用指针函数,强调代码只用作参考
  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. int strlen(char *s);
  4. int strchang(char **p1, char **p2, int flag);

  5. int main(void)
  6. {
  7.         char a[]="abc" , b[]="def"; // 依据题意是字符串(不是字符数组,2者还是有区别的),或 char a[3]={'a', 'b', 'c', '\0'}
  8.                 char *p_a , *p_b ;
  9.         int flag;
  10.                 int nFlag; // 多声明个nFlag,用来接收strchang的返回值,作用是用来释放手动malloc申请的内存,这很有必要

  11.         p_a = a;
  12.         p_b = b;

  13.         printf("Please input a number:\n");
  14.         scanf("%d", &flag);

  15.                 nFlag = strchang(&p_a, &p_b, flag); // 应该是p_a, 加*就是取该指针指向的值了;我这里加&是因为我里面要修改指针里面存放的地址,故加&;返回值在p_a中

  16.         printf("%s\n", p_a);

  17.                 // 释放函数里面手动申请的内存
  18.                 if(nFlag)
  19.                 {
  20.                         free(p_a);
  21.                         p_a = NULL;
  22.                 }

  23.                 return 0;
  24. }

  25. int strlen(char *s)
  26. {
  27.         int i;

  28.         i = 0;
  29.         while(*s != '\0')
  30.         {
  31.                 s++;
  32.                 i++;
  33.         }

  34.         return i;
  35. }

  36. int strchang(char **p1, char **p2, int flag)
  37. {
  38.         char *tmp1, *tmp2, *p, *tmp_p;
  39.         int len;

  40.         tmp1 = *p1; // 指向字符串
  41.         tmp2 = *p2;
  42.        
  43.         switch(flag)
  44.         {
  45.         case 1:
  46.                 // 复制(a-->b), 以tmp1的长度为标准
  47.                 while(!(*tmp1 == '\0' || *tmp2 == '\0')) // 此处为什么不用 while 要用for,明显就是while比效好
  48.                 {
  49.                         *tmp2 = *tmp1;
  50.                         tmp1++;
  51.                         tmp2++;
  52.                 }
  53.                
  54.                 // 修改p1的地址
  55.                 *p1 = *p2;

  56.                 return 0;


  57.         case 2:
  58.                 // 连接(a&b-->a)
  59.                 len = strlen(tmp1)+strlen(tmp2);
  60.                 p = (char *)malloc(sizeof(char) * (len + 1));
  61.                 if (p == NULL)
  62.                 {
  63.                         printf("分配空间失败!");
  64.                         exit (1);
  65.                 }

  66.                 tmp_p = p; // tmp_p作用是用来移动指针p,这样p就不用移动了,还是原来的地址
  67.         while(*tmp1 != '\0') // 复制tmp1 到 tmp_p
  68.                 {
  69.                         *tmp_p = *tmp1;
  70.                         tmp1++;
  71.                         tmp_p++;
  72.                 }

  73.                 while(*tmp2 != '\0') // 复制tmp2 到 tmp_p
  74.                 {
  75.                         *tmp_p = *tmp2;
  76.                         tmp2++;
  77.                         tmp_p++;
  78.                 }
  79.                
  80.                 // 别忘了加 '\0'
  81.                 *tmp_p = '\0';

  82.                 *p1 = p; // 最后修改p1的地址

  83.                 return 1;

  84.         case 3:
  85.                 // 交换功能(a<-->b)

  86.                 // 直接交换地址即可
  87.                 p = *p1;
  88.                 *p1 = *p2;
  89.                 *p2 = p;

  90.                 return 0;
  91.         }

  92.         
  93.         return 0;
  94.    
  95. }

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-6-2 11:23:05 From FishC Mobile | 显示全部楼层
我建议你去百度一下strcat()和strcpy()的源代码作为参考
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

好的谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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




然后参考代码: 你也可以用指针函数,强调代码只用作参考
  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. int strlen(char *s);
  4. int strchang(char **p1, char **p2, int flag);

  5. int main(void)
  6. {
  7.         char a[]="abc" , b[]="def"; // 依据题意是字符串(不是字符数组,2者还是有区别的),或 char a[3]={'a', 'b', 'c', '\0'}
  8.                 char *p_a , *p_b ;
  9.         int flag;
  10.                 int nFlag; // 多声明个nFlag,用来接收strchang的返回值,作用是用来释放手动malloc申请的内存,这很有必要

  11.         p_a = a;
  12.         p_b = b;

  13.         printf("Please input a number:\n");
  14.         scanf("%d", &flag);

  15.                 nFlag = strchang(&p_a, &p_b, flag); // 应该是p_a, 加*就是取该指针指向的值了;我这里加&是因为我里面要修改指针里面存放的地址,故加&;返回值在p_a中

  16.         printf("%s\n", p_a);

  17.                 // 释放函数里面手动申请的内存
  18.                 if(nFlag)
  19.                 {
  20.                         free(p_a);
  21.                         p_a = NULL;
  22.                 }

  23.                 return 0;
  24. }

  25. int strlen(char *s)
  26. {
  27.         int i;

  28.         i = 0;
  29.         while(*s != '\0')
  30.         {
  31.                 s++;
  32.                 i++;
  33.         }

  34.         return i;
  35. }

  36. int strchang(char **p1, char **p2, int flag)
  37. {
  38.         char *tmp1, *tmp2, *p, *tmp_p;
  39.         int len;

  40.         tmp1 = *p1; // 指向字符串
  41.         tmp2 = *p2;
  42.        
  43.         switch(flag)
  44.         {
  45.         case 1:
  46.                 // 复制(a-->b), 以tmp1的长度为标准
  47.                 while(!(*tmp1 == '\0' || *tmp2 == '\0')) // 此处为什么不用 while 要用for,明显就是while比效好
  48.                 {
  49.                         *tmp2 = *tmp1;
  50.                         tmp1++;
  51.                         tmp2++;
  52.                 }
  53.                
  54.                 // 修改p1的地址
  55.                 *p1 = *p2;

  56.                 return 0;


  57.         case 2:
  58.                 // 连接(a&b-->a)
  59.                 len = strlen(tmp1)+strlen(tmp2);
  60.                 p = (char *)malloc(sizeof(char) * (len + 1));
  61.                 if (p == NULL)
  62.                 {
  63.                         printf("分配空间失败!");
  64.                         exit (1);
  65.                 }

  66.                 tmp_p = p; // tmp_p作用是用来移动指针p,这样p就不用移动了,还是原来的地址
  67.         while(*tmp1 != '\0') // 复制tmp1 到 tmp_p
  68.                 {
  69.                         *tmp_p = *tmp1;
  70.                         tmp1++;
  71.                         tmp_p++;
  72.                 }

  73.                 while(*tmp2 != '\0') // 复制tmp2 到 tmp_p
  74.                 {
  75.                         *tmp_p = *tmp2;
  76.                         tmp2++;
  77.                         tmp_p++;
  78.                 }
  79.                
  80.                 // 别忘了加 '\0'
  81.                 *tmp_p = '\0';

  82.                 *p1 = p; // 最后修改p1的地址

  83.                 return 1;

  84.         case 3:
  85.                 // 交换功能(a<-->b)

  86.                 // 直接交换地址即可
  87.                 p = *p1;
  88.                 *p1 = *p2;
  89.                 *p2 = p;

  90.                 return 0;
  91.         }

  92.         
  93.         return 0;
  94.    
  95. }

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢指导
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-1 07:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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