[day02]间接赋值条件、领域推演、间接赋值场景、较好拷贝演示、考虑内存看函数、字符串课堂操练、三道考试题

 

1. 间接赋值条件

间接赋值成立的三个条件

条件1:定义了一个变量(实参)定义了一个变量(形参)

条件2:建立关联,//实参取地址传给形参

条件3://*p形参,去间接的修改实参的值

 

2. 领域推演

整个C/C++领域值得我们做技术推演的领域

1.0级指针到1级指针,1级指针到2级指针,2级指针到3级指针

2.C++多态(函数指针做函数参数)

3.Aop切面编程

 

3. 间接赋值场景

间接赋值的可以有以下三种场景

条件123 写在一个函数里面,那么成了第一个应用场景。

条件12 条件3 间接赋值是指针存在的最大意义。

条件1 条件23 抛砖,,,,到时候,要认识啊。

间接赋值的常用应用场景有2个

场景1:在函数指针  *p1++ = *p2++

场景2:指针做函数参数,通过*p形参求间接的修改实参的值,这才是指针存在的最大意义、。

Ps:这才是C语言特有的现象,才是指针的精华

 

4. 较好拷贝演示

简单的字符串拷贝

/*注意:++的优先级,高于* */
int copy_str(char *from , char *to)
{
    …
    while((*to ++ = *from++) != '\0');
    …
}

封装函数中需要主要的东西

1.  先要判断from,to指针是否为NULL,切记

2.  记得通过返回返回错误

3.  尽量使用指针做函数参数,int型的一样,不要用返回值返回,返回值一般用来返回错误。

 

5.看函数原型注意

考虑内存看函数

记得先分析指针变量是在哪里分配内存的。

 

6. 字符串课堂操练

字符串课堂操练

1在c中没有字符串这种类型,是通过字符串数组(char buf[100])去模拟

2 字符串和字符串数组的区别 是不是 带有\0

初始化数组有两种方法

1 不指定长度

1 char buf[] = {'a', 'b', 'c'}; //buf是个指针 是个常量指针

2 指定长度

1 char buf2[10] = {'a', 'b', 'c'};

strlen与sizeof区别

strlen() 是一个函数 求字符串的长度(不是求字符数组的长度),它的长度不包括\0

sizeof() 是一个操作符,求数据类型(实体)的大小

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    char *p = "abc"; /* 在常量区分配四个字节,将地址给p */
    char buf1[] = { 'a', 'b', 'c' }; /* 总共的长度为3,只会分配3个字节,没有多余的来存'\0' */

    /* 只要指定的数组的长度大于你分配的字符数,
    编译器默认会在后面补上'\0' */
    char buf2[5] = { 'a', 'b', 'c', 'd' }; /* 自动补上'\0' */
    //char buf2[4] = { 'a', 'b', 'c', 'd' }; /* 不会自动补上'\0' */
    
    printf("p:%s\n", p); /* abc */
    printf("buf1:%s\n", buf1); /* abc乱码 */
    printf("buf2:%s\n", buf2); /* abcd */

    printf("sizeof(p):%d\n", sizeof(p)); /* 4 仅仅是代表因为p是个指针变量的原因 */
    printf("sizeof(buf1):%d\n", sizeof(buf1)); /* 3 */
    printf("sizeof(buf2):%d\n", sizeof(buf2)); /* 5 */

    system("pause");

    return 0;
}

 

7. 字符串中挖字符串

字符串中挖字符串

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int cntSub(char *pstr, char *psub, int *count)
{
    int ret = 0;
    if (pstr == NULL || psub == NULL || count == NULL) {
        ret = -1;
        printf("err code is %d, err occur in point is NULL.\n", ret);
        return ret;
    }

    int tmpcnt = 0;
    char *tmpstr = pstr;
    char *tmpsub = psub;

    while (tmpstr = strstr(tmpstr, tmpsub)) {
        tmpcnt++;
        tmpstr += strlen(tmpsub);
    }

    *count = tmpcnt;

    return ret;
}

int main(void)
{
    char *sub = "abcd";
    char *pstr = "abcd788882abc999abcd0009kiabcda";
    int count;
    int ret;

    ret = cntSub(pstr, sub, &count);

    if (ret < 0) {
        exit(ret);
    }

    printf("count:%d\n", count);
    
    system("pause");

    return 0;
}
 strstr函数解释

strstr返回的是搜索到的字符串

比如:pstr中第一次搜索sub,返回abcd788882abc999abcd0009kiabcd

第二次搜索返回abcd0009kiabcd

 

8.自己做的三道考试题代码

1、有一个字符串开头或结尾含有n个空格(”   abcdefgdddd    ”),欲去掉前后空格,返回一个新字符串。

                   要求1:请自己定义一个接口(函数),并实现功能;70分

                   要求2:编写测试用例。30分

        int trimSpace(char *inbuf, char *outbuf);

#include <stdio.h>

int trimSpace(char *inbuf, char *outbuf)
{
    int ret = 0;

    if (inbuf == NULL || outbuf == NULL) {
        ret = -1;
        printf("func trimSpace err: %d\n", ret);
        return ret;
    }

    char *inp = inbuf;

    while (*inp != '\0') {
        if (*inp == ' ') {
            inp ++;
        } else {
            *outbuf ++ = *inp ++;
        }
    }

    return ret;
}

int main(void)
{
    char inbuf[50] = "   abcdefgdddd    ";
    char outbuf[50];
    int ret = 0;

    if (!(ret = trimSpace(inbuf, outbuf))) {
        printf("outbuf:%s\n", outbuf);
    }

    return 0;
}

2、有一个字符串”1a2b3d4z”,;

要求写一个函数实现如下功能,

        功能1:把偶数位字符挑选出来,组成一个字符串1。valude;20分

        功能2:把奇数位字符挑选出来,组成一个字符串2,valude 20

                   功能3:把字符串1和字符串2,通过函数参数,传送给main,并打印。

                   功能4:主函数能测试通过。

        int getStr1Str2(char *source, char *buf1, char *buf2);

#include <stdio.h>
#include <stdlib.h>

int getStr1Str2(char *source, char *buf1, char *buf2)
{
    int ret = 0;

    if (source == NULL || buf1 == NULL || buf2 == NULL) {
        ret = -1;
        printf("func getStr1Str2 err %d\n", ret);
        return ret;
    }

    char *tmpsrc = source;
    int cnt = 1;

    while (*tmpsrc != '\0') {
        if ((cnt++) % 2 != 0)
            *buf1 ++ = *tmpsrc ++;
        else
            *buf2 ++ = *tmpsrc ++;
    }

    *buf1 = *buf2 = '\0';

    return ret;
}

int main(void)
{
    char source[50] = "1a2b3d4z";
    char buf1[25];
    char buf2[25];
    int ret = 0;

    ret = getStr1Str2(source, buf1, buf2);

    if (ret < 0) {
        exit(ret);
    }

    printf("buf1:%s\n", buf1);
    printf("buf2:%s\n", buf2);

    return 0;
}

3、键值对(”key = valude”)字符串,在开发中经常使用;

        要求1:请自己定义一个接口,实现根据key获取valude;40分

        要求2:编写测试用例。30分

        要求3:键值对中间可能有n多空格,请去除空格30分

        注意:键值对字符串格式可能如下:

            “key1 = valude1”

            “key2 =       valude2

            “key3  = valude3”

            “key4        = valude4”

            “key5   =   “

            “key6   =“

            “key7   =   “

 

            int getVauleByKey(char *keyvaluebuf,  char *keybuf,  char *valuebuf, int * valuebuflen);

            int main()

            {

            getKeyByValude(“key1 = valude1”, ” key1”, buf, &len);

            }

#include <stdio.h>

int trimSpace(char *inbuf, char *outbuf)
{
    int ret = 0;

    if (inbuf == NULL || outbuf == NULL) {
        ret = -1;
        printf("func trimSpace err: %d\n", ret);
        return ret;
    }

    char *inp = inbuf;

    while (*inp != '\0') {
        if (*inp == ' ') {
            inp ++;
        } else {
            *outbuf ++ = *inp ++;
        }
    }

    *outbuf = '\0';

    return ret;
}

int getKeyByValude(char *keyvaluebuf,  char *keybuf,  char *valuebuf, int * valuebuflen)
{
    int ret = 0;

    if (keyvaluebuf == NULL || keybuf == NULL
        || valuebuf == NULL || valuebuflen == NULL) {
            ret = -1;
            printf("func getKeyByValude err: %d\n", ret);
        }

    char *tmpsrc = keyvaluebuf;
    int direct = 0;
    *valuebuflen = 0;

    while (*tmpsrc != '\0') {
        if (*tmpsrc != '=' && direct == 0) {
            *keybuf ++ = *tmpsrc ++;
        }

        if (*tmpsrc == '=') {
            //如果输入的字符串类似"=value", key为空,不处理即可

            direct = 1;
            tmpsrc ++;

            //如果输入的字符串类似"key=",value为空
            if (*tmpsrc == '\0') {
                break;
            }
        }

        if (tmpsrc != '\0' && direct == 1){
            *valuebuf ++ = *tmpsrc ++;
            (*valuebuflen) ++; //注意++的优先级高于*
        }
    }

    *keybuf = *valuebuf = '\0';

    return ret;
}

int main(void)
{
    //char inbuf[50] = "key1 = valude1";
    //char inbuf[50] = "key2 =       valude2";
    //char inbuf[50] = "key3  = valude3";
    //char inbuf[50] = "key4        = valude4";
    //char inbuf[50] = "key5   =   ";
    char inbuf[50] = "=   value6";

    char keyvaluebuf[50];
    char keybuf[25];
    char valuebuf[25];
    int valuebuflen;
    int ret = 0;

    if (!(ret = trimSpace(inbuf, keyvaluebuf))) {

        printf("keyvaluebuf:%s\n", keyvaluebuf);

        if (!(ret = getKeyByValude(keyvaluebuf, keybuf, valuebuf, &valuebuflen))) {
            printf("keybuf:%s\n", keybuf);
            printf("valuebuf:%s\n", valuebuf);
            printf("valuebuflen:%d\n", valuebuflen);
        }
    }

    return 0;
}
posted @ 2014-12-27 21:38  IFPELSET  阅读(445)  评论(0编辑  收藏  举报