最近在看c语言的书,觉得还蛮有意思,有点收获,收集了几个优美的C语言程序。

1 将10进制数装换为任意进制数的小函数

char *
baseconv(unsigned int num, int base)
{
	static char retbuf[33];
	char *p;

	if(base < 2 || base > 16)
		return NULL;

	p = &retbuf[sizeof(retbuf)-1];
	*p = '\0';

	do{
		*--p = "0123456789abcdef"[num % base];
		num /= base;
	}while(num != 0);

	return p;
}

“abcdef”[5]可以理解为 char *p = “abcdef”; …p[5]… 数组和下标在c语言中可以互换,所以也可写成5[“abcdef”](不提倡哈,原因你懂的)

2 计算无符号整数中为1的位的个数

static int bittab[] = {
	0,1,1,2,
	1,2,2,3,
	1,2,2,3,
	2,3,3,4
};

int bitcount(unsigned int u)
{
	int n = 0;

	for(; u != 0; u >>= 4)
		n += bittab[u & 0x0f];

	return n;
}

有关按位操作也没啥好介绍的,只是这个bittab数组构造的很精巧。

3 free函数的封装

void saferFree(void **pp)
{
	if(pp != NULL && *pp != NULL){
		free(*pp);
		*pp = NULL;
	}
}

#define safeFree(p) saferFree((void**)&(p))

free函数不会检查传入的指针是否是NULL,也不会在返回前把指针置为NULL。释放指针之后将其置为NULL是个好习惯。