C提高_day03_一级指针易犯错误模型

1、char *(字符串)做函数参数出错模型分析
建立一个思想:是主调函数分配内存,还是被调用函数分配内存;
//不要相信,主调函数给你传的内存空间,你可以写。。。。。。一级指针你懂了。
但是二级指针,你就不一定懂。。。抛出。。。。。。。。。

void copy_str21(char *from, char *to)
{

    if (*NULL = ‘\0‘ || *to!=’\0’)
    {
        Printf(“func copy_str21() err\n”);
        return;
    }

    for (; *from!=‘\0‘; from++, to++)
    {
        *to = *from;
    }
    *to = ‘\0‘;
}
//字符串逆序
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、不断修改指针变量的值

void copy_str_err(char *from, char *to)
{
    for (; *from!=‘\0‘; from++, to++)
    {
        *to = *from;
    }
    *to = ‘\0‘;
    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 != ‘\0‘)
        {
            *valuebuf = *keyvaluebuf;
            valuebuf++;
            keyvaluebuf++;
        }
        *valuebuf = ‘\0‘;
    }

    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 != ‘\0‘);
    //printf("count:%d \n", 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 != ‘\0‘)
    {
        printf("ddddd");
    }
    for (; *from!=‘\0‘; from++, to++)
    {
        *to = *from;
    }
    *to = ‘\0‘;
    printf("to:%s", to);
    printf("from:%s", from);
}

void copy_str_err(char *from, char *to)
{
    for (; *from!=‘\0‘; from++, to++)
    {
        *to = *from;
    }
    *to = ‘\0‘;
    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("\n %s",from);
    getchar();
    return 0;
}
时间: 2024-10-22 09:20:33

C提高_day03_一级指针易犯错误模型的相关文章

C提高_day03_二级指针内存示意图(没有比这重要的了)

//指针数组 char  *pszBuf[] = {"123", "456", "789"}; //二维数组 char *psz[3][4]  = {"123", "456", "789"};   //手工二维内存 char **p3 = (char **)malloc(3 * sizeof(char *));        //这句相当于int array[3];    //p3就分配

C提高_day03_二级指针做输入第2种内存模型

#include <stdlib.h> #include <string.h> #include <stdio.h> //打印 排序 //封装成函数 void main() { int i = 0, j = 0; int num = 4; char tmpBuf[30]; char myArray[10][30] = {"aaaaaa", "ccccc", "bbbbbbb", "1111111111

C++笔记007:易犯错误模型——类中为什么需要成员函数

先看源码,在VS2010环境下无法编译通过,在VS2013环境下可以编译通过,并且可以运行,只是运行结果并不是我们期待的结果. 最初通过MyCircle类定义对象c1时,为对象分配内存空间,r没有初始化,其值为乱码,pi为3.1415926,area为乱码. [cin>>c1.r]这个语句为c1.r赋值,假设为10,然后执行[cout<<c1.area<<endl],我们来看,执行cout时是从内存空间中拿c1.area的值,这个值在定义对象时候已经确定是一个乱码值,此

(C++)函数参数传递中的一级指针和二级指针

(C++)函数参数传递中的一级指针和二级指针 主要内容: 1.一级指针和二级指针 2.函数指针传递的例子 3.什么时候需要传递二级指针? 4.二级指针在链表中的使用 1.一级指针和二级指针 一级指针:即我们一般说的指针,就是内存地址: 二级指针:指向指针的指针,就是地址的地址: 如: int a=1; int *p=&a; // p为a变量的地址,通过*p可以得到a的值 int **q=&p; // q为p指针的地址,通过**q可以得到a的值 2.函数指针传递的例子 程序1: 1 2 3

【转】十个JavaScript中易犯的小错误,你中了几枪?

在今天,JavaScript已经成为了网页编辑的核心.尤其是过去的几年,互联网见证了在SPA开发.图形处理.交互等方面大量JS库的出现. 如果初次打交道,很多人会觉得js很简单.确实,对于很多有经验的工程师,或者甚至是初学者而言,实现基本的js功能几乎毫无障碍.但是JS的真实功能却比很多人想象的要更加多样.复杂.JavaScript的许多细节规定会让你的网页出现很多意想不到的bug,搞懂这些bug,对于成为一位有经验的JS开发者很重要. 常见错误一:对于this关键词的不正确引用 我曾经听一位喜

数据挖掘中易犯的十大错误

按照Elder博士的总结,这10大易犯错误包括: 0. 缺乏数据(Lack Data)1. 太关注训练(Focus on Training)2. 只依赖一项技术(Rely on One Technique)3. 提错了问题(Ask the Wrong Question)4. 只靠数据来说话(Listen (only) to the Data)5. 使用了未来的信息(Accept Leaks from the Future)6. 抛弃了不该忽略的案例(Discount Pesky Cases)7.

数据挖掘中易犯的几大错误【转载,侵删】

原文标题为"Top 10 Data Mining Mistakes",作者是John F. Elder IV, Ph.D.编译:IDMer(数据挖掘者)http://www.salford-systems.com/doc/elder.pdf 按照Elder博士的总结,这10大易犯错误包括: 0. 缺乏数据(Lack Data) 1. 太关注训练(Focus on Training) 2. 只依赖一项技术(Rely on One Technique) 3. 提错了问题(Ask the W

十个JavaScript中易犯的小错误,你中了几枪?

序言 在今天,JavaScript已经成为了网页编辑的核心.尤其是过去的几年,互联网见证了在SPA开发.图形处理.交互等方面大量JS库的出现. 如果初次打交道,很多人会觉得js很简单.确实,对于很多有经验的工程师,或者甚至是初学者而言,实现基本的js功能几乎毫无障碍.但是JS的真实功能却比很多人想象的要更加多样.复杂.JavaScript的许多细节规定会让你的网页出现很多意想不到的bug,搞懂这些bug,对于成为一位有经验的JS开发者很重要. 常见错误一:对于this关键词的不正确引用 我曾经听

十个JavaScript中易犯的小错误

在今天,JavaScript已经成为了网页编辑的核心.尤其是过去的几年,互联网见证了在SPA开发.图形处理.交互等方面大量JS库的出现. 如果初次打交道,很多人会觉得js很简单.确实,对于很多有经验的工程师,或者甚至是初学者而言,实现基本的 js功能几乎毫无障碍.但是JS的真实功能却比很多人想象的要更加多样.复杂.JavaScript的许多细节规定会让你的网页出现很多意想不到的 bug,搞懂这些bug,对于成为一位有经验的JS开发者很重要. 常见错误一:对于this关键词的不正确引用 我曾经听一