随笔分类 -  C语言随笔

C语言相关知识、技巧
摘要:函数简介:函数名称: strrchr函数原型:char *strrchr(char *str, char c);所属库: string.h函数功能:查找一个字符c在另一个字符串str中末次出现的位置(也就是从str的右侧开始查找字符c首次出现的位置),并返回从字符串中的这个位置起,一直到字符串结束的所有字符。如果未能找到指定字符,那么函数将返回NULL。相关函数:strchr示例(获取给定路径中文件名):char *GetFileName(char * filePath){ char * name = NULL; name = strrchr(filePath,'/'); i. 阅读全文
posted @ 2013-08-15 10:33 ╭爵☆爷╯ 阅读(844) 评论(0) 推荐(0)
摘要:最近参考Linux实现的通用双向链表时,因typeof并不是标准c规定的关键字,除GCC编译器外其他编译器未必支持typeof关键字,所以在使用上并不能想Linux所实现的链表哪样灵活,它要求将连接器即链表结构作为用户自定义结构体的第一个元素使用,话不多说,直接上代码,内嵌详细注释。IList.h 1 #ifndef _I_LIST_H_2012_11_23_ 2 #define _I_LIST_H_2012_11_23_ 3 4 #ifdef __cplusplus 5 extern "C" { 6 #endif 7 8 /** \brief 双向链表连接器 9 ... 阅读全文
posted @ 2013-08-13 14:05 ╭爵☆爷╯ 阅读(760) 评论(0) 推荐(0)
摘要:介绍 我们在衡量一个函数运行时间,或者判断一个算法的时间效率,或者在程序中我们需要一个定时器,定时执 行一个特定的操作,比如在多媒体中,比如在游戏中等,都会用到时间函数。还比如我们通过记录函数或者算法开始和截至的时间,然后利用两者之差得出函数或者 算法的运行时间。编译器和操作系统为我们提供了很多时间函数,这些时间函数的精度也是各不相同的,所以,如果我们想得到准确的结果,必须使用合适的时间函 数。现在我就介绍windows下的几种常用时间函数。1:Sleep函数使用:sleep(1000),在Windows和Linux下1000代表的含义并不相同,Windows下的表示1000毫秒,也就是1秒钟 阅读全文
posted @ 2013-08-11 21:58 ╭爵☆爷╯ 阅读(1425) 评论(0) 推荐(0)
摘要:临界区,内核事件,互斥量,信号量,都能完成线程的同步,在这里把他们各自的函数调用,结构定义,以及适用情况做一个总结。临界区:适用范围:它只能同步一个进程中的线程,不能跨进程同步。一般用它来做单个进程内的代码快同步,效率比较高。相关结构:CRITICAL_SECTION _critical相关方法:/*初始化,最先调用的函数。没什么好说的,一般windows编程都有类似初始化的方法*/InitializeCriticalSection(&_critical)/*释放资源,确定不使用_critical时调用,一般在程序退出的时候调用。如果以后还要用_critical,则要重新调用Initi 阅读全文
posted @ 2013-08-11 21:56 ╭爵☆爷╯ 阅读(443) 评论(0) 推荐(0)
摘要:1. even每个字节传送整个过程中bit为1的个数是偶数个(校验位调整个数)2. odd每个字节穿送整个过程中bit为1的个数是奇数个(校验位调整个数)3. noparity没有校验位4. space校验位总为05. mark校验位总为1 阅读全文
posted @ 2013-08-11 21:47 ╭爵☆爷╯ 阅读(317) 评论(0) 推荐(0)
摘要:校验和计算参考RFC文献1. 前言校验和计算是NAT功能和内容修改功能的基本功,这些操作进行后都需要修改数据头中的校验和。2. 16位校验和计算2.1 基本原理IP/ICMP/IGMP/TCP/UDP等协议的校验和算法都是相同的,采用的都是将数据流视为16位整数流进行重复叠加计算。为了计算检验和,首先把检验和字段置为0。然后,对有效数据范围内中每个16位进行二进制反码求和,结果存在检验和字段中,如果数据长度为奇数则补一字节0。当收到数据后,同样对有效数据范围中每个16位数进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么 阅读全文
posted @ 2013-08-11 21:45 ╭爵☆爷╯ 阅读(1097) 评论(0) 推荐(0)
摘要:1.closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:BOOL bReuseaddr=TRUE;setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL));2.如果要已经处于连接状态的soket在调用closesocket后强制关闭,不经历TIME_WAIT的过程:BOOL bDontLinger = FALSE;setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinge 阅读全文
posted @ 2013-08-11 21:44 ╭爵☆爷╯ 阅读(204) 评论(0) 推荐(0)
摘要:断言Andrei Alexandrescu本部分“泛型”讨论断言(assertions),一个你兵器库内非常强大的工具。以assert为基础,我们建立一个更强大的工具,帮助你建立更好的程序。我们很快就能看到,断言不仅是简单的工具/宏/函数。这是一种生活方式,一道深深的鸿沟把程序员们分成两类:了解,和不了解断言的力量。Assert(cool);那么,断言到底包含了什么?为什么你要重视断言?你什么时候需要用到断言,并且同样重要的,什么时候你不想要用到断言。我的看法是断言(例如用标准assert宏表示)是一个最最简单强大的工具来保证程序的正确性。断言的威力通常被低估了,至少在我参与的项目中是这样。可 阅读全文
posted @ 2013-08-11 21:42 ╭爵☆爷╯ 阅读(430) 评论(0) 推荐(0)
摘要:在我们的开发测试阶段不可避免的要进行打印调试,在生成release的版时又需要去除打印信息,我们可以采用条件编译的方式解决这个问题,具体方法如下:#ifndef DEBUG_2012_06_06#define DEBUG_2012_06_06#endif#ifdef DEBUG_2012_06_06#define myPrint(str, ...) {\ printf(str, ##__VA_ARGS__);\}#else#define myPrint(str, ...)#endif这样我们在打印输出的地方使用我们自己的myPrint宏就像使用printf函数一样使用,在生成rele... 阅读全文
posted @ 2013-08-11 21:39 ╭爵☆爷╯ 阅读(331) 评论(0) 推荐(0)
摘要:写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性 等等。下面列举一些成熟软件中常用得宏定义。。。。。。1,防止一个头文件被重复包含#ifndef COMDEF_H#define COMDEF_H//头文件内容#endif2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。typedef unsigned char boolean; /* Boolean value type. */typedef unsigned long int uint32; /* Unsigned 32 bit value */typedef uns 阅读全文
posted @ 2013-08-11 21:37 ╭爵☆爷╯ 阅读(315) 评论(0) 推荐(0)
摘要:在C语言中,将某一位置0或置1,可以写成宏的形式,如下:#define SETBIT(x,y) (x |= (1>y) & 1) //获取X的第Y位的值 阅读全文
posted @ 2013-08-11 21:29 ╭爵☆爷╯ 阅读(135) 评论(0) 推荐(0)
摘要:在我们的C语言程序中,经常用到布尔类型,但是C标准并不支持布尔类型,但我们可以自己实现其类型,实现代码如下:typedef enum{ false = 0, ture = !false}bool; 阅读全文
posted @ 2013-08-11 21:25 ╭爵☆爷╯ 阅读(999) 评论(5) 推荐(0)