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 != '\0');//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\n", ret);
        system("pause");
        return ret;
    }
    printf("p=%s\n", p);
    printf("buf=%s\n", buf);
    /*
    if (buf != NULL) {
        free(buf);
        buf = NULL;
    }
    */

    freeBuf(buf);
    //freeBuf1(&buf);
    printf("\n");
    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\n", 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\n", 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\n", buf[i]);
    }

    for (i = 0; i < n; i++) {
        free(buf[i]);
        buf[i] = NULL;
    }
    if (buf != NULL) {
        free(buf);
        buf = NULL;
    }
    printf("\n");
    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\n", buf[i]);
}
*/

 

posted @ 2018-08-09 15:54  砍柴人Ryan  阅读(320)  评论(0编辑  收藏  举报