即将就业,也复习复习相关的知识,看了看嵌入式C的笔试题,整体感觉考试题目还是蛮有意思的,考点都比较重要,而且比较细,主要还是设计到一些指针和数组已经函数指针等基本的概念。 比如: 如何实现两个值中的最大值:((a+b) + abs(a-b))/2 如何实现不依靠中间量实现两个变量值的交换: a = a + b; b = a - b; a = a - b; 或者 a = a^b; b = a^b; a = a^b; 其中后面的这种方式更加的优越。 sizeof与strlen的区别 其中sizeof是一个操作符,在编译过程中就能确定结果,但是strlen是一个函数,只有在运行的时候才能得到返回值。 指针、数组、函数等各种形式的指针结合起来也是出题的重点。 在编程中主要是设计到字符串、链表的处理问题,我就找几个简单的程序当做练兵吧。实现整数和字符串之间的转换问题。这个转换问题实质上是处理好ASCII码与数字之间的切换关系,即数字的ASCII码形式为‘0’= 0 + 48; ‘9’= 9 + 48;0 = 0-48。 这个关系是转换过程中最主要的问题,当然整数到字符串的转换过程中需要注意负数的影响,如果负数没有正确处理,就可能出现一些莫名其妙的结果。 首先实现字符串到整数的转换过程:这个过程相对来说比较容易,因为这个过程可直接判断是正数还是负数,直接判断下标0对应的内容即可,其他的可以通过逐步求和累加的形式实现。基本的转换过程如下: int myatoi(char *src) { char flag = 0; int sum = 0; int i = 0; int len = strlen(src); /*参数的正确性*/ if(NULL == src) { return 0; } /*是否存在符号问题*/ if(src == -) { flag = -; ++ i ; } for( ; i < len ; ++ i) { /*判断字符是否合法*/ if(src < 48 && src > 57) return 0; /*数据求和,注意数值的转换问题src - 48*/ sum = sum *10 + src - 48; } /*根据标志位实现返回正确的正负数*/ if(flag == -) return -sum; else return sum; } 整数到字符串的转换:实际上就是将一个整数的各个位分离出来,然后实现字符串的排序问题,因为数字长度的不确定性使得不便于快速的确定字符串的长度,只能首先分解,然后排序。同时也需要注意符号的存在,基本的转换过程如下: char* myitoa(int num, char *str) { char flag = 0; int i = 0, count = 0, j = 0; /*参数检测*/ if(NULL == str) { return NULL; } /*判断数值的正负,设置对应的符号*/ if(num < 0) { str[i ++] = -; /************************ 同时要对数值取绝对值 保证后面取余整除操作正常 *************************/ num = -num; } while(num / 10) { /*************************** count用来保存实际的数字个数, 便于后期的顺序调换 ****************************/ ++ count; /*实际保存的顺序为反序列*/ str[i++] = num % 10 + 48; num /= 10; } /*判断是*/ if(num %10) { str[i++] = num %10 + 48; ++ count; } /*字符串结束符*/ str = 0; /*实现数据的较好操作*/ i = 0; if(str[0] == -) { i = 1; } /*实际交换的下标区间为i~j*/ j = count + i - 1; for(; i < j ; ++ i, --j) { /*数据的较好操作*/ str = str + str[j]; str[j] = str - str[j]; str = str - str[j]; } /*返回实际的字符串*/ return str; } 上面的代码就实现了字符串与整数的转换问题,基本上实现了各种情况的转换。 |
关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )
GMT+8, 2025-9-23 16:27 , Processed in 0.109375 second(s), 27 queries , Gzip On.
地址:深圳市南山区科技生态园2栋A座805 电话:19926409050