zoukankan      html  css  js  c++  java
  • C提高_day03_一级指针易犯错误模型

    1、char *(字符串)做函数参数出错模型分析
    建立一个思想:是主调函数分配内存,还是被调用函数分配内存;
    //不要相信,主调函数给你传的内存空间,你可以写。。。。。。一级指针你懂了。
    但是二级指针,你就不一定懂。。。抛出。。。。。。。。。
    
    void copy_str21(char *from, char *to)
    {
    
        if (*NULL = '' || *to!=’0’) 
        {
            Printf(“func copy_str21() err
    ”);
            return; 
        }
        
        for (; *from!=''; from++, to++)
        {
            *to = *from;
        }
        *to = '';
    }
    //字符串逆序
    int main()
    {
        //char p[1024] ={0};
        char *p  ={0}; p = NULL;
    
        char to[100];
        copy_str21(p, to);
    
    C语言中没有你不知道的,只有你不会调
    Java语言中没有你不会调的,只有你不知道  
    不断修改内存指针变量

    2、越界

    越界 语法级别的越界

    char buf[3] = "abc";

    3、不断修改指针变量的值

    11

    void copy_str_err(char *from, char *to)
    {
        for (; *from!=''; from++, to++)
        {
            *to = *from;
        }
        *to = '';
        printf("to:%s", to);
        printf("from:%s", from);
    }

    4、你向外面传递什么

    1、临时str3内存空间
    // char *str_cnct(x,y)     /*简化算法*/
    //     char *x,*y;
    char *str_cnct(char *x, char* y)     /*简化算法*/
    {
        char str3[80];
        char *z=str3;     /*指针z指向数组str3*/ 
        while(*z++=*x++);
        z--;                   /*去掉串尾结束标志*/
        while(*z++=*y++);
        z=str3;         /*将str3地址赋给指针变量z*/
        return(z);
    }
    2、经验要学习
    while(*z++=*x++);
        z--;                   /*去掉串尾结束标志*/
    
    char *str_cnct(char *x, char* y)     /*简化算法*/
    {
        char * str3= (char *)malloc(80)
        char *z=str3;     /*指针z指向数组str3*/ 
        while(*z++=*x++);
        z--;                   /*去掉串尾结束标志*/
        while(*z++=*y++);
        z=str3;         /*将str3地址赋给指针变量z*/
        return(z);
    }
    
    char *str_cnct(char *x, char* y)     /*简化算法*/
    {
    If (x == NULL)
    {
    Return NULL;
    }
        char * str3= (char *)malloc(80)
        char *z=str3;     /*指针z指向数组str3*/ 
        while(*z++=*x++);
        z--;                   /*去掉串尾结束标志*/
        while(*z++=*y++);
        z=str3;         /*将str3地址赋给指针变量z*/ note:
        return(z);
    
    }
    Main ()
    {
    Char *p = str_cnct(“abcd”, “ddeee”);
    If (p != NULL) {Free(p) ;p = NULL}//yezhizhen
    }
    int getKeyByValude(char *keyvaluebuf,  char *keybuf,  char *valuebuf, int * valuebuflen)
    {
        int result = 0;
        char *getbuf = new char[100];
        memset(getbuf, 0, sizeof(getbuf));
    
        char *trimbuf = new char[100];
        memset(trimbuf, 0, sizeof(trimbuf));
    
        int destlen = strlen(keyvaluebuf);
    
        if (keybuf == NULL || keyvaluebuf == NULL || valuebuf == NULL/* || valuebuflen == NULL*/)
        {
            result = -1;
            return  result;
        }
        
        if (strstr(keyvaluebuf, keybuf) == NULL)
        {
            result = -1;
            return result;
        }
        else
        {
            for (int i = 0; i < destlen; i++)
            {
                if (*keyvaluebuf == '=')
                {
                    *keyvaluebuf++;
                    break;
                }
                keyvaluebuf++;
            }
            while(*keyvaluebuf != '')
            {
                *valuebuf = *keyvaluebuf;
                valuebuf++;
                keyvaluebuf++;
            }
            *valuebuf = '';
        }
    
        int len = strlen(valuebuf);
        return result;
    }
    
    //char *p = "abcd11111abcd2222abcdqqqqq"; //字符串中"abcd"出现的次数。
    //要求你 自己写一个函数接口,并且写出测试用例。
    //完成功能为:求出“abcd”字串出现的次数
    //输入:
    int getSubCount(char *str, char *substr, int *   mycount)
    {
        int ret = 0;
        char *p = str;
        char *sub = substr;
        int count = 0;
    
        if (str==NULL || substr==NULL || mycount == NULL)
        {
            ret = -1;
            return ret;
        }
    
        //char *p = "abcd11111abcd2222abcdqqqqqabcd";
        //char *p2 = NULL;
        //p2 = p;
        do 
        {
            p = strstr(p, sub);
            if (p!= NULL)
            {
                count++;
                //++后缀操作符优先级高,所以先执行*p操作 然后地址++
                *mycount++;
    
                p = p + strlen(sub);
            }
            else
            {
                break;
            }
        } while (*p != '');
        //printf("count:%d 
    ", count);
    
        //mycount是实参的地址 *(实参的地址)
        *mycount = count;
        return ret;
    }

    五、看图

    方法

    六、重复的错误何时休

    #include "stdio.h"
    #include "stdlib.h"
    #include "string.h"
    
    void copy_str21_modify(char *from, char *to)
    {
        int i = 0;
        if (*from != '')
        {
            printf("ddddd");
        }
        for (; *from!=''; from++, to++)
        {
            *to = *from;
        }
        *to = '';
        printf("to:%s", to);
        printf("from:%s", from);
    }
    
    void copy_str_err(char *from, char *to)
    {
        for (; *from!=''; from++, to++)
        {
            *to = *from;
        }
        *to = '';
        printf("to:%s", to);
        printf("from:%s", from);
    }
    
    //字符串逆序
    int mainaaaa()
    {
        char buf1[100] = "abcdefg";
        char to[100];
        copy_str_err(buf1, to);
    }
    
    
    //越界场景
    int main00000000000()
    {
        char from[5] = "abcde";
        printf("
     %s",from);
        getchar();
        return 0;
    }
    Stay hungry,Stay foolish
  • 相关阅读:
    Leetcode 16.25 LRU缓存 哈希表与双向链表的组合
    Leetcode437 路径总和 III 双递归与前缀和
    leetcode 0404 二叉树检查平衡性 DFS
    Leetcode 1219 黄金矿工 暴力回溯
    Leetcode1218 最长定差子序列 哈希表优化DP
    Leetcode 91 解码方法
    Leetcode 129 求根到叶子节点数字之和 DFS优化
    Leetcode 125 验证回文串 双指针
    Docker安装Mysql记录
    vmware虚拟机---Liunx配置静态IP
  • 原文地址:https://www.cnblogs.com/zhesun/p/4954921.html
Copyright © 2011-2022 走看看