zoukankan      html  css  js  c++  java
  • c提高第三次作业

    1. char buf[] = "abcdef";

    //下面有啥区别?
    const char *p = buf; //p指向的内存不能变
    char const *p = buf; //p指向的内存不能变
    char * const p = buf; //p的地址不能变
    const char *const *p = buf; //p的地址和指向的内存都不能改变

    2. char *p1[] = {"1111", "2222", "3333"};
    sizeof(p1)/sizeof(p1[0]) = ?

    //结果是3

    char *p2[10] = {"1111", "2222", "3333"};
    sizeof(p2)/sizeof(p2[0]) = ?

    //10

    char p3[][30] = {"1111", "2222", "3333"};
    sizeof(p3)/sizeof(p3[0]) = ?

    //3

    char p4[10][30] = {"1111", "2222", "3333"};
    sizeof(p4)/sizeof(p4[0]) = ?

    //10

    3. char buf[][30] = {"1111", "2222", "3333"};
    二维数组做函数参数,为什么不能这么写?
    void fun(char **buf);

    void fun(char **buf) 和 void fun(char buf[][30]) 有什么区别?

    步长不一样,buf[][30]指定了+1 时候的步长30

    4. 画出三种二级指针内存模型图

    mian()
    {
    //指针数组
    char *p1[] = {"123", "456", "789"};

    //二维数组
    char p2[3][4] = {"123", "456", "789"};

    //手工二维内存
    char **p3 = (char **)malloc(3 * sizeof(char *)); //char *array[3];

    int i = 0;
    for (i=0; i<3; i++)
    {
    p3[i] = (char *)malloc(10*sizeof(char)); //char buf[10]

    sprintf(p3[i], "%d%d%d", i, i, i);
    }

    }

    5. 有字符串有以下特征(“abcd11111abcd2222abcdqqqqq”),求写一个函数接口,输出以下结果。
    把字符串替换成(dcba11111dcba2222dcbaqqqqq),并把结果传出。
    要求:
    1. 正确实现接口和功能
    2. 编写测试用例
    /*
    src: 原字符串
    dst: 生成的或需要填充的字符串
    sub: 需要查找的子字符串
    new_sub:提换的新子字符串

    return : 0 成功
    -1 失败
    */
    int replaceSubstr(/* in */char *src, /* out */char** dst,
    /* in */char *sub, /* in */char *new_sub);

    #pragma warning(disable:4996)
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #pragma disable
    /*
    有字符串有以下特征(“abcd11111abcd2222abcdqqqqq”), 求写一个函数接口,输出以下结果。
    把字符串替换成(dcba11111dcba2222dcbaqqqqq),并把结果传出。
    要求:
    1. 正确实现接口和功能
    2. 编写测试用例
    
    src:    原字符串
    dst:    生成的或需要填充的字符串
    sub:    需要查找的子字符串
    new_sub:提换的新子字符串
    
    return : 0 成功
    -1 失败
    */
    int replaceSubstr(/* in */char *src, /* out */char** dst,
        /* in */char *sub,  /* in */char *new_sub) {
        if (src == NULL || dst == NULL||
            sub == NULL || new_sub == NULL)
        {
            return -1;
        }
        /*
        src="ddddabcd11111abcd2222abcdqqqqq"
        sub="abcd"
        new_sub="aaaaaa"
        */
    
        char *start = src;
        char *p = NULL;
        char tmp[512] = { 0 };
        int len = 0;
    
        do {
            /*
            src="ddddabcd11111abcd2222abcdqqqqq"
            sub="abcd"
            new_sub="aaaaaa"
            */
            p = strstr(start, sub);
            if (p != NULL) {
                len = 0;
                len = p - start;
                if (len > 0) {
                    strncat(tmp, start, len);    //tmp="dddd"
                }
                strncat(tmp, new_sub, strlen(new_sub));    //tmp="ddddaaaaa"
                
                //重新设置起点位置
                start = p + strlen(sub);
            }
            else {
                strcat(tmp, start);
                break;
            }
    
        } while (*start != '');//strrt[i]!=0
    
        char *buf = (char*)malloc(strlen(tmp) + 1);
        strcpy(buf, tmp);
        
        //间接赋值,是指针存在的最大意义
        *dst = buf;
    
        return 0;
    }
    void freeBuf(char *buf) {
        if (buf != NULL) {
            free(buf);
            buf = NULL;
        }
    }
    void freeBuf1(char **buf) {
        char *tmp = *buf;    //tmp是指向堆区的指针
        if (tmp != NULL) {
            free(tmp);
        }
        *buf = NULL;
    }
    int main() {
        char *p = "dddabcd11111abcd2222abcdqqqqq";
        char *buf = NULL;//在哪replaceSubstr函数中分配空间
        int ret = 0;
    
        ret = replaceSubstr(p, &buf, "abcd", "aaaaa");
        if (ret != 0) {
            printf("replaceSubstr err:%d
    ", ret);
            system("pause");
            return ret;
        }
        printf("p=%s
    ", p);
        printf("buf=%s
    ", buf);
        /*
        if (buf != NULL) {
            free(buf);
            buf = NULL;
        }
        */
    
        freeBuf(buf);
        //freeBuf1(&buf);
        printf("
    ");
        system("pause");
        return 0;
    }

    6. 有一个字符串符合以下特征(“abcdef,acccd,eeee,aaaa,e3eeee,ssss,”)

    写两个函数(API),输出以下结果
    第一个API(第二种内存模型)
    1)以逗号分隔字符串,形成二维数组,并把结果传出
    2)把二维数组行数运算结果也传出
    int spitString(const char *str, char c, char buf[10][30], int *count);

    第二个API(第三种内存模型)
    1)以逗号分隔字符串,形成一个二级指针。
    2)把一共拆分多少行字符串个数传出
    int spitString2(const char *str, char c, char **myp /*in*/, int *count);

    要求:
    1, 能正确表达功能的要求,定义出接口。
    2, 正确实现接口和功能.
    3, 编写正确的测试用例.

    #pragma warning(disable:4996)
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    //有一个字符串符合以下特征(“abcdef,acccd,eeee,aaaa,e3eeee,ssss,”)
    
    int spitString(const char *str, char c, char buf[10][30], int *count) {
        if (str == NULL || count == NULL) {
            return -1;
        }
        //str="abcdef,acccd,eeee,aaaa,e3eeee,ssss,"
        const char *start = str; 
        char *p = NULL;
        int i = 0;
        do {
            p = strchr(start, c);//strchr在c++中的返回值为const char*
            if (p != NULL) {
                int len = p - start;
                strncpy(buf[i], start, len);
                //结束符
                buf[i][len] = 0;
    
                i++;
    
                //重新设定起点位置
                start = p + 1;
            }
            else {
                //printf("strat=%s
    ", start);
                strcpy(buf[i], start);
                i++;
                break;
            }
        } while (*start != 0);
        
        if (i == 0) {
            return -2;
        }
    
        *count = i;
    
        return 0;
    }
    char **getMem(int n) {
        char **buf = NULL;//char *buf[n]
        buf = (char**)malloc(n * sizeof(char*));//char*
        if (buf == NULL) {
            return NULL;
        }
    
        int i = 0;
        for (i = 0; i < n; i++) {
            buf[i] = (char*)malloc(30);
        }
        return buf;
    }
    
    int spitString2(const char *str, char c, char **buf /*in*/, int *count) {
        if (str == NULL || count == NULL) {
            return -1;
        }
        //str="abcdef,acccd,eeee,aaaa,e3eeee,ssss,"
        const char *start = str;
        char *p = NULL;
        int i = 0;
        do {
            p = strchr(start, c);//strchr在c++中的返回值为const char*
            if (p != NULL) {
                int len = p - start;
                strncpy(buf[i], start, len);
                //结束符
                buf[i][len] = 0;
    
                i++;
    
                //重新设定起点位置
                start = p + 1;
            }
            else {
                //printf("strat=%s
    ", start);
                strcpy(buf[i], start);
                i++;            
                break;
            }
        } while (*start != 0);
    
        if (i == 0) {
            return -2;
        }
    
        *count = i;
    
        return 0;
        return 0;
    }
    int main(){
        const char *p = "abcdef,acccd,eeee,aaaa,e3eeee,ssss,";
        char **buf = NULL;
    
        int n = 0;
        int i = 0;
        int ret = 0;
    
        buf = getMem(6);
        if (buf == NULL) {
    
            return -1;
        }
    
        ret = spitString2(p, ',', buf, &n);
        if (ret != 0) {
            printf("spitString err:%d", ret);
    
            system("pause");
            return ret;
        }
    
        for (i = 0; i < n; i++) {
            printf("%s
    ", buf[i]);
        }
    
        for (i = 0; i < n; i++) {
            free(buf[i]);
            buf[i] = NULL;
        }
        if (buf != NULL) {
            free(buf);
            buf = NULL;
        }
        printf("
    ");
        system("pause");
        return 0;
    }
    /*
    测试函数1
    const char *p = "abcdef,acccd,eeee,aaaa,e3eeee,ssss,";
    char buf[10][30] = { 0 };
    
    
    int n = 0;
    int i = 0;
    int ret = 0;
    ret = spitString(p, ',', buf, &n);
    if (ret != 0) {
    printf("spitString err:%d", ret);
    
    system("pause");
    return ret;
    }
    
    for (i = 0; i < n; i++) {
    printf("%s
    ", buf[i]);
    }
    */
  • 相关阅读:
    Redis的配置与数据类型
    CSRF Failed: CSRF token missing or incorrect
    腾讯防水墙实现验证码
    Rest_Framework常用插件
    rest_framework序列化
    Nginx项目部署
    Nginx
    Django设置允许跨域请求
    Rest_Framework的视图与路由
    Rest_Framework
  • 原文地址:https://www.cnblogs.com/zyqy/p/9449470.html
Copyright © 2011-2022 走看看