月度归档:2013年04月

C 程序你要注意的地方【更新中】

一年一度的毕业季 就要来到啦, 面试啦。下面 总结一些 编程的 小毛病,面试时,给自己 提醒,加油

0 代码风格与注释: 灰常灰常重要,因为代码 要给面试官 看!

建议先写伪代码,将解题思路与编程细节分离。

1  溢出:

① 超过 整数范围 : 比如 经典的 二分查找,很多人 这样写 mid = (left + right) /2 。 现在你知道这是一个Bug

② 越界访问或缓冲区溢出: 通常是因为 使用的了 指针,而 判断条件 没写对,造成 超过 数组范围。或者 从小内存类型 强制转换为大内存类型,比如 short 转 int。或者 对某些库函数不熟悉,比如我看到很多人使用sprintf。比如 sprintf(buf,”%10s”,pStr)。buf的长度显然不一定是10。

2 未释放动态分配的内存(资源未释放)

其原因是 往往动态分配内存是为了多个函数访问,但未明确那个函数来释放这块内存。建议:写一个malloc 就写一个free,先不管写在哪。或者 自己数 malloc和free的个数 是否匹配。

3 对空指针解引用

对指针强制转换使用的非常爽。以致于 都不检查是否是 NULL 指针。顺便说下,对关闭的文件指针,释放的内存指针。设置为NULL是个好习惯。

4 变量初始化

因为 有时间变量第一个操作是赋值,而且初始化要多写代码,所以慢慢养成了不初始化的习惯。但不得不说,这并不是一个好的习惯。

5 递归函数 一定要避免死循环,超时或者 大量内存占用基本 都是来自于此

6 。。。

————————————————————-

本文 搜集 那些 编译器 也不会 告诉你的 错误或问题,欢迎 留言

JS Unicode 2 UTF-8

【概念】
JavaScript String
ECMA :The String Type is the set of all finite ordered sequences of zero or more 16-bit unsigned integer values(“elements”).
(字符串类型是所有由0个或多个16位无符号整数组成的有限顺序序列的集合。)
这个16-bit value 是 UTF-16 表示的字符的值 (Unicode编码, code point)。(详见参考文献 ECMA-262)
综上:JS String 是字符集合,不是字节集合。其字符使用Unicode编码,UTF-16表示,但只支持基本平面等同于UCS-2。
【基本方法】
charCodeAt :  返回指定索引位置的字符的值(即字符的Unicode编码值, 相当于 某些语言的 ord)
fromCharCode : 返回值表示的字符 (相当于 某些语言的 chr 或 unichr)
escape  : 转义字符,将 除字母,数字以及字符(* @ – _ + . / ) 之外的 字符 都转化为 转义序列
             其中: 字符值 小于等于0xff 的为%XX,大于的为 %uXXXX
decodeURI:转换字符,使用 UTF-8 值
decodeURIComponent:同上,但转义字符更多,参考文献 escape。
【转换】

References:

escape,decodeURI,decodeURIComponent: ascii-js

ASCII JS

ASCII 7-bit (0-127) 共128个值。
其中 有  33 个 控制字符:0-31,127
             52 个 字母 : 65-90,97-122
             10 个数字: 48-57
             33 个 可打印字符:32-47,58-64,91-96,123-126  (包含 空格 SP)
32非空格字符分别是: ! ” # $ % & ‘ ( ) * + , – . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~  这32个字符在键盘都有,可以直接输入。
常见控制字符: 0 NUL 空字符,  7 BEL 响铃, 10 LF 换行, 13 CR 回车, 24 CAN 取消 ,27 ESC 转换 ,127 DEL 删除
window 文件名非法字符有: \ / : * ? ” < > | (其中:\ / : 用在路径中 * 用作通用符 用来包含字符串比如含空格的路径,| 管道符号 )
字符转换函数:
escape: 转换 普通字符为 十六进制值的转义序列, 除了 字母,数字以及字符 *+-./@_
encodeURI:转换 普通字符为 UTF-8 值 序列,除了 字母,数字 以及字符 !#$&'()*+,-./:;=?@_~
encodeURIComponent:同上,除了 字母,数字以及字符 !'()*-._~
测试代码如下:

 

References:

Decorator pattern (Python)

装饰模式(Python)
装饰模式 和 适配器模式 一样,属于 对象结构型模式。别名:wrapper
它 可以为对象 添加 一些 额外的职责,同时避免系统的复杂性

举例: 我们要做一个文件存储管理的服务。有很多服务类型,除了类型还有各种小组件可选。
这时我们就可以选用 装饰模式 来设计这些文件类型和功能组件。python代码如下。

 

 

 

可以看到 通过装饰模式,可以很方便的 为系统 添加新的类型 和 功能组件。
通过 工厂模式,可以很方便 管理 这些 类型和功能的 组合。为系统 未来的 扩展,提供了 极大的方便。

当然 如果在可预计的未来 没有很多类型和组件, 使用 继承 是一种更简单的方式。比如 就只有 一个类型,多版本一个可选组件。只需要两个2子类。

Reference:
设计模式:可复用面向对象软件的基础
Head First Design Patterns

来自为知笔记(Wiz)