当前位置:   article > 正文

第7章 C语言的函数封装思想 (五)_封装一个 char *mystrcat(char *dest, const char *src) 实

封装一个 char *mystrcat(char *dest, const char *src) 实现字符串的连接

文档视频讲解链接地址

  1. 腾讯课堂链接 : 70_函数_函数封装思想练习1
  2. 腾讯课堂链接 : 71_函数_函数封装思想练习2

7.5 函数封装思想

  1. 函数封装思想也是模块化编程思想

  2. 实例95

    • 具体要求请参考实例61

    • 使用函数封装mystrcat函数 , 封装如下

    // 函数定义 
    char *mystrcat(char *dest, const char *src)
    {
        // 自己实现代码 , 把前面做过的代码放到这个函数内 
    }
    
    // 函数调用 
    mystrcat(str1,str2) ; 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 源文件
    01-cbase\95-mystrcat.c
    
    • 1
    • 源代码
    #include <stdio.h> 
    #include <string.h>
    #include <assert.h>
    
    // dest = str1 , src = str2
    // 指针函数
    char * my1strcat(char * dest,char * src)
    {
        // 先把 str1的下标定位到'\0'位置 
        int len = 0 , i=0 ; 
        while(dest[len] != '\0') len ++; 
        // len 就是'\0' 字符串结尾的下标 
    
        // 优化的实现 
        while((dest[len++]  = src[i++]) != '\0' ) ;// str1[len] != '\0' 要继续复制, 等于'\0'结束循环 
        return dest;
    }
    
    char * my2strcat(char *dest, char *src)
    {
         //断言dest和src不为空,这一句就可以看出代码的严谨性
        assert(dest != NULL && src != NULL);
    
        //保留源地址用于返回,用于支持链式操作,
        //如strcat(str1, strcat(str2, str3));
        //在strcpy等中也有同样的操作,很好的思想。
        char *p = dest;
    
        //移动到dest末尾,不能while(*dest++),这样会移动到'\0'的下一位,想想为什么?
        while(*dest)//等价于(while(*dest) != '\0')
        {
            dest++;
        }
    
        //把src拼接到dest后面
        while(*dest++ = *src++);
    
        return p;
        
    }
    
    int main(int argc, char const *argv[])
    {
        char str1[100]={0},str2[50]={0}; 
        printf("请输入第1个字符串 >:") ; 
        scanf("%s",str1);
        printf("请输入第2个字符串 >:");
        scanf("%s",str2);
        printf("str1=%s\n",str1); 
        printf("str2=%s\n",str2); 
        //strcat(str1,str2) ; // 把str2 接到str1的后面,形成一个新的字符串 (str1 + str2)
        //my1strcat(str1,str2); // dest = str1 , src = str2
        my2strcat(str1,str2); // dest = str1 , src = str2
    
        printf("str1=%s\n",str1); 
        printf("str2=%s\n",str2); 
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 运行结果
    请输入第1个字符串 >:goodbye
    请输入第2个字符串 >:hello
    str1=goodbye
    str2=hello
    str1=goodbyehello
    str2=hello
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  3. 实例96

    • 要求封装函数实现mystrcpy , 具体要求请参考实例63
    // 函数定义 
    char *mystrcpy(char *dest, const char *src)
    {
        // 自己实现代码 , 把前面做过的代码放到这个函数内 
    }
    
    // 函数调用 
    mystrcpy(str1,str2) ; 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 源文件
    01-cbase\96-mystrcpy.c
    
    • 1
    • 源代码
    #include <stdio.h> 
    #include <string.h> 
    
    char * my1strcpy(char *dest, char *src)
    {
        int i=0,j=0;
        while( (dest[i++] = src[j++]) != '\0' )  ; 
        return  dest ;
    }
    
    char *my2strcpy(char *dst, const char *src)
    {
        char *cp = dst;
        while (*cp++ = *src++) ; /* Copy src over dst */
        return (dst);
    }
    
    int main(int argc, char const *argv[])
    {
        char str1[100]={0},str2[50]={0}; 
        printf("请输入第1个字符串 >:") ; 
        scanf("%s",str1);
        printf("请输入第2个字符串 >:");
        scanf("%s",str2);
        printf("str1=%s\n",str1); 
        printf("str2=%s\n",str2); 
        //strcpy(str1,str2) ; // 把str2 复制到str1 , str1 == str2 , '\0' 会被一同复制 
        //my1strcpy(str1,str2); // dest = str1, src = str2
        my2strcpy(str1,str2); // dest = str1, src = str2
    
    
        printf("str1=%s\n",str1); 
        printf("str2=%s\n",str2); 
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 运行结果
    // 第一次运行
    请输入第1个字符串 >:good
    请输入第2个字符串 >:bye
    str1=good
    str2=bye
    str1=bye
    str2=bye
        
    // 第二次运行
    请输入第1个字符串 >:goodbye
    请输入第2个字符串 >:hello
    str1=goodbye
    str2=hello
    str1=hello
    str2=hello
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  4. 实例97

    • 要求封装函数实现mystrcmp , 具体要求请参考实例67
    • 源文件
    01-cbase\97-mystrcmp.c
    
    • 1
    • 源代码
    #include <stdio.h>
    #include <string.h>
    
    // s1 = str1 , s2 = str2 
    // 返回值:  
    // str1 < str2 : 返回负数 
    // str1 > str2 : 返回正数 
    // str1 = str2 : 返回 0  
    int my1strcmp(const char *s1, const char *s2)
    {
        int ret, i = 0;
        while (1)
        {
            ret = s1[i] - s2[i];
            if (ret < 0) // str1 < str2
            {
                return ret; 
            }
            else if (ret > 0) // str1 > str2
            {
                return ret; 
            }
            else // ret == 0 ,  str1[i] == str2[i]
            {
                if (s1[i] == '\0') // 表示 str1[i] == str2[i] == '\0' , 两个字符串已经相等
                {
                    return ret ; 
                }
                i++ ; // 往后移动 
            }
        }
    
    }
    
    int my2strcmp(const char *str1, const char *str2)
    {
        int ret = 0;
        while (!(ret = *(unsigned char *)str1 - *(unsigned char *)str2) && *str1)
        {
            str1++;
            str2++;
        }
        if (ret < 0)
        {
            return -1;
        }
        else if (ret > 0)
        {
            return 1;
        }
        return 0;
    }
    
    int main(int argc, char const *argv[])
    {
        char str1[100] = {0}, str2[50] = {0};
        printf("请输入第1个字符串 >:");
        scanf("%s", str1);
        printf("请输入第2个字符串 >:");
        scanf("%s", str2);
        printf("str1=%s\n", str1);
        printf("str2=%s\n", str2);
        // int ret = strcmp(str1,str2) ; // 比较str1 和str2 的大小关系
        int ret = my1strcmp(str1,str2) ; // 比较str1 和str2 的大小关系
        if(ret < 0)
        {
            printf("str1 < str2\n");
        }
        else if(ret > 0)
        {
            printf("str1 > str2\n");
        }
        else 
        {
            printf("str1 = str2\n");
        }
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 运行结果
    // 第一次 
    请输入第1个字符串 >:goodbye
    请输入第2个字符串 >:goodbye
    str1=goodbye
    str2=goodbye
    str1 = str2
    
    // 第二次 
    请输入第1个字符串 >:goodbyea
    请输入第2个字符串 >:goodbyeb
    str1=goodbyea
    str2=goodbyeb
    str1 < str2
    
    // 第三次 
    请输入第1个字符串 >:goodbye
    请输入第2个字符串 >:good
    str1=goodbye
    str2=good
    str1 > str2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  5. 实例98

    • 要求封装函数实现冒泡排序bubble_sort() , 具体要求请参考实例53
    // pa 用来保存数组名
    // n  用来保存数组元素个数
    int bubble_sort(int *pa,int n)
    {
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 源文件
    01-cbase\98-maopao.c
    
    • 1
    • 源代码
    #include <stdio.h> 
    
    #define  N   7 
    
    // 冒泡排序 
    // pa : 排序数组的地址 
    // n  : 参与排序的元素个数 
    int bubble_sort(int *pa,int n)
    {
        for (int i = 0; i < n - 1; i++) // 外层循环控制排序的次数 ,
        {
            for (int j = 0, t = 0; j < n - 1 - i; j++) // 内层循环控制每一次排序需要比较的次数
            {
                if (pa[j] > pa[j + 1])
                {
                    t = pa[j];
                    pa[j] = pa[j + 1];
                    pa[j + 1] = t;
                }
            }
        }
    }
    
    // 显示数组内容 
    // pa : 数组的地址 
    // n  : 数组元素个数 
    int display_array(int *pa,int n )
    {
        printf("数组的内容为 >:"); 
        for(int i=0;i<n;i++)
        {
            printf("%d ",pa[i]); 
        }
        printf("\n");
        return 0; 
    }
    
    int input_array(int *pa,int n)
    {
        for(int i=0;i<n;i++)
        {
            printf("请输入第%d个数>:",i+1);
            scanf("%d",pa+i);
        }   
    }
    
    
    int main(int argc, char const *argv[])
    {
        int a[N]={0};
        input_array(a,N);
        display_array(a,N);  // pa = a , n = N 
        bubble_sort(a,N);  
        display_array(a,N);
    
    
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 运行结果
    请输入第1个数>:12
    请输入第2个数>:7
    请输入第3个数>:23
    请输入第4个数>:345
    请输入第5个数>:98
    请输入第6个数>:83
    请输入第7个数>:70
    数组的内容为 >:12 7 23 345 98 83 70 
    数组的内容为 >:7 12 23 70 83 98 345 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  6. 实例99

    • 要求封装函数实现selection_sort() , 具体要求请参考实例54
    // pa 用来保存数组名
    // n  用来保存数组元素个数
    int selection_sort(int *pa,int n)
    {
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 源文件
    01-cbase\99-selection.c
    
    • 1
    • 源代码
    #include <stdio.h> 
    
    #define  N   7 
    
    int input_array(int *pa,int n)
    {
        for(int i=0;i<n;i++)
        {
            printf("请输入第%d个数>:",i+1);
            scanf("%d",pa+i);
        }
        return 0 ; 
    }
    int display_array(int *pa,int n)
    {
        printf("数组的内容为 >:"); 
        for(int i=0;i<n;i++)
        {
            printf("%d ",pa[i]); 
        }
        printf("\n");
        return 0 ; 
    }
    int selection_sort(int *pa,int n)
    {
        for(int i=0,k,t;i<n-1;i++) // 外层循环控制排序的次数 , 
        {
            k = 0 ; // k是记录最大数的下表, 从0开始
            for(int j=0;j<n-1-i;j++) // 内层循环控制每一次排序需要比较的次数 
            {
                if(pa[k] < pa[j+1]) // 是使用a[k]和a[j+1]进行比较, 保存最大数的下标
                {
                    k = j+1 ; // k 记录最大数的下标 
                }
            }
            // 把记录的最大数和最后一个元素进行交换
            // 如果k的值等于最后一个元素的下标, 则不用交换 
            // 如果k的值不等于最后一个元素的下标, 则交换 
            if(k != n-1-i) 
            {
                t = pa[k]; 
                pa[k] = pa[N-1-i];
                pa[n-1-i] = t; 
            } 
        }
        return 0 ; 
    }
    
    int main(int argc, char const *argv[])
    {
        int a[N]={0};
        input_array(a,N); 
        display_array(a,N); 
        selection_sort(a,N); 
        display_array(a,N);
    
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 运行结果
    请输入第1个数>:12
    请输入第2个数>:7
    请输入第3个数>:23
    请输入第4个数>:345
    请输入第5个数>:98
    请输入第6个数>:83
    请输入第7个数>:70
    数组的内容为 >:12 7 23 345 98 83 70 
    数组的内容为 >:7 12 23 70 83 98 345
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/43395
推荐阅读
相关标签
  

闽ICP备14008679号