[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; } |