随笔分类 -  C

摘要:昨天在《C Programming FAQs》上看见了一段类似的代码,刚刚在CSDN问了,又Google了一下,整理下来。代码:#include <stdio.h>FILE *myfopen(char *name){FILE *fp=fopen(name,"w");fprintf(fp,"abcdefg");return fp;}int main(){FILE *fptr=myfopen("example.txt");fprintf(fptr,"ABCDEFG");fclose(fptr);return 阅读全文
posted @ 2011-08-16 17:52 hnrainll 阅读(929) 评论(0) 推荐(0)
摘要:1,时间的获取:通过time()函数来获得日历时间(Calendar Time),其原型为:time_t time(time_t * timer);#include "stdafx.h"#include "time.h"#include "stdio.h"#include "stdlib.h"int main(void){struct tm t; //定义tm时间结构,用来存储时间格式的数据信息time_t t_of_day; //定义time_t时间结构t.tm_year=2006-1900;//以1900年为标 阅读全文
posted @ 2011-08-11 22:06 hnrainll 阅读(2132) 评论(0) 推荐(0)
摘要:read函数只是一个通用的读文件设备的接口。是否阻塞需要由设备的属性和设定所决定。一般来说,读字符终端、网络的socket描述字,管道文件等,这些文件的缺省read都是阻塞的方式。如果是读磁盘上的文件,一般不会是阻塞方式的。但使用锁和fcntl设置取消文件O_NOBLOCK状态,也会产生阻塞的read效果。怎么样以非阻塞的方式从管道中读取数据?因为我用read函数时,如果管道没有数据就会阻塞住??? 我的代码是: char chBuff[32]; read(file_pipe[0], chBuff, 16); 如果管道没有数据我这个函数就永远不返回,请问有没有其它的方式,如果管道有数据就读取, 阅读全文
posted @ 2011-08-11 17:51 hnrainll 阅读(20349) 评论(0) 推荐(0)
摘要:continue1、结束本次循环,继续下次循环,并且进行条件判断;2、不可作用于switch语句。当在switch中使用,这个continue实际是作用于其所属的循环结构;若它不属于任何一个循环,程序将因此报错!break1、结束本次循环,并停止下次循环条件判断;2、可以作用于switch语句。开关语句中,执行switch语句之后的代码。1. continuecontinue 可用于 C 提供的全部三种循环结构。continue 会致使循环跳过循环体中余下的语句,转而判断循环条件是否仍然成立,然后选择是否再次进入循环体。如果 continue 位于循环嵌套中的一个内循环,则其仅能影响该内循环的 阅读全文
posted @ 2011-08-10 14:24 hnrainll 阅读(7075) 评论(0) 推荐(0)
摘要:/*变参函数原理说明:va_start就是求得第一个可变参的地址.下面几个宏的作用:保是来确定可变参数的列表中每个参数的地址.实现变参函数的要点,就是想办法取得每个参数的地址.*/#include <stdio.h> #include <stdarg.h>#if 0#define va_list void*#define va_arg(arg, type) *(type*)arg; arg = (char*)arg + sizeof(type);#define va_start(arg, start) arg = (va_list)(((char*)&(star 阅读全文
posted @ 2011-08-05 14:38 hnrainll 阅读(355) 评论(0) 推荐(0)
摘要:在学习C语言的过程中我们可能很少会去写变参函数,印象中大学老师好像也没有提及过,但我发现变参函数的实现很巧妙,所以还是特地在此分析下变参函数的实现原理。无需标准C的支持,我们自己写代码来实现。先来看看一个实现代码:#include <stdio.h> #define va_list void*#define va_arg(arg, type) *(type*)arg; arg = (char*)arg + sizeof(type);#define va_start(arg, start) arg = (va_list)(((char*)&(start)) + sizeof( 阅读全文
posted @ 2011-08-05 12:26 hnrainll 阅读(499) 评论(0) 推荐(0)
摘要:摘要:一直以来都觉得printf似乎是c语言库中功能最强大的函数之一,不仅因为它能格式化输出,更在于它的参数个数没有限制,要几个就给几个,来者不拒。printf这种对参数个数和参数类型的强大适应性,让人产生了对它进行探索的浓厚兴趣。 关键字:printf, 可变参数 1. 使用情形 int a =10;double b = 20.0;char *str = "Hello world";printf("begin print\n");printf("a=%d, b=%.3f, str=%s\n", a, b, str);... 从pri 阅读全文
posted @ 2011-08-05 12:25 hnrainll 阅读(12312) 评论(1) 推荐(1)
摘要:第一:什么是可变参数int printf(const char* format, ...);看到printf的定义大家就知道了,只有一个固定的const char*参数,后面的都是不定长的参数列表了。第二:自己写一个可变参数函数1.参数形参方式,跟printf类似,第一个为固定参数,后面的用...代替;2.包含stdarg.h头文件,因为需要用到几个里面定义的宏;void va_start(va_list arg_ptr, prev_param);type va_arg(va_list arg_ptr, type);void va_end(va_list arg_ptr);va是variabl 阅读全文
posted @ 2011-08-05 12:24 hnrainll 阅读(916) 评论(0) 推荐(0)
摘要:简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,生成各个目标文件 (.obj文件) 4.连接阶段,将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关的可执行文件,当然,最后还可以用objcopy生成纯二进制码,也就是去掉了文件格式信息。(生成.exe文件) 编译器在编译时是以C文件为单位进行的,也就是说如果你的项目中一个C文件都没有,那么你的项目将无法编译,连接器是以目标文件为单位,它将一个或多. 阅读全文
posted @ 2011-08-04 12:33 hnrainll 阅读(3456) 评论(0) 推荐(2)
摘要:C语言提供一种特殊的运算符——逗号运算符。用它将两个表达式连接起来。如: 3+5,6+8称为逗号表达式,又称为“顺序求值运算符”。逗号表达式的一般形式为 表达式1,表达式2逗号表达式的求解过程是:先求解表达式1,再求解表达式2。整个逗号表达式的值是表达式2的值。例如,上面的逗号表达式“3+5,6+8”的值为14。又如,逗号表达式 a=3*5,a*4对此表达式的求解,读者可能会有两种不同的理解:一种认为“3*5,a*4” 是一个逗号表达式,先求出此逗号表达式的值, 如果a的原值为3,则逗号表达式的值为12,将12赋给a, 因此最后a的值为12。另一种认为:“a=3*5”是一个赋值表达式”,“a. 阅读全文
posted @ 2011-08-03 21:17 hnrainll 阅读(89850) 评论(10) 推荐(17)
摘要:gethostbyname和gethostbyaddr这两个函数仅仅支持IPv4,getaddrinfo函数能够处理名字到地址以及服务到端口这两 种转换,返回的是一个sockaddr结构的链表而不是一个地址清单。这些sockaddr结构随后可由套接口函数直接使用。如此以 来,getaddrinfo函数把协议相关性安全隐藏在这个库函数内部。应用程序只要处理由getaddrinfo函数填写的套接口地址结构。该函数在 POSIX规范中定义了。#include<netdb.h>int getaddrinfo( const char *hostname, const char *servic 阅读全文
posted @ 2011-08-03 17:44 hnrainll 阅读(3196) 评论(0) 推荐(0)
摘要:循环链表的运算与单链表的运算基本一致,所不同的有以下几点:(1)在建立一个循环链表时,必须使其最后一个节点的指针指向表头节点,而不是像单链表那样置为NULL。此种情况适用于在最后一个节点后插入一个新节点。(2)判断是否到表尾采用判断该节点链域的值是否是表头节点的方法,当链域值等于表头指针时,说明已到表尾,而不是像单链表那样判断链域值是否为NULL。 约瑟夫问题:编号为1~N的N个人按顺时针方向围坐一圈,每人持有一个密码(正整数),开始人选一个正整数作为报数上限值M,从第一个人按顺时针方向自1开始顺序报数,报道M时停止报数。报M的人出列,将他的密码作为新的M值,从他顺时针方向上的下一个人开始从1 阅读全文
posted @ 2011-08-03 16:39 hnrainll 阅读(823) 评论(1) 推荐(0)
摘要:我们经常会听到这样的说法,不懂得函数指针就不是真正的C语言高手。我们不管这句话对与否,但是它都从侧面反应出了函数指针的重要性,所以我们还是有必要掌握对函数指针的使用。先来看看函数指针的定义吧。 函数是由执行语句组成的指令序列或者代码,这些代码的有序集合根据其大小被分配到一定的内存空间中,这一片内存空间的起始地址就成为函数的地址,不同的函数有不同的函数地址,编译器通过函数名来索引函数的入口地址,为了方便操作类型属性相同的函数,c/c++引入了函数指针,函数指针就是指向代码入口地址的指针,是指向函数的指针变量。 因而“函数指针”本身首先应该是指针变量,只不过该指针变量指向函数。这正如用指针变量可指 阅读全文
posted @ 2011-07-28 09:21 hnrainll 阅读(670) 评论(0) 推荐(0)
摘要:realloc()函数原型:extern void *realloc(void *mem_address, unsigned int newsize);语法:指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。 头文件:#include <stdlib.h> 有些编译器需要#include <alloc.h>,在TC2.0中可以使用alloc.h头文件 功能:先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域,同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。 阅读全文
posted @ 2011-07-28 08:14 hnrainll 阅读(727) 评论(0) 推荐(0)
摘要:最近在写source code时需要在数组的buffer小时重新申请一块buffer,故找了一些资料,乖乖,竟然原指针还可以“漂移”。。。。。。realloc 原型:extern void *realloc(void *mem_address, unsigned int newsize); 用法:#include <stdlib.h> 有些编译器需要#include <alloc.h> 功能:改变mem_address所指内存区域的大小为newsize长度。 说明:如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。 当内存不再使用时,应使用free() 阅读全文
posted @ 2011-07-27 21:23 hnrainll 阅读(6344) 评论(1) 推荐(1)
摘要:图片可以在下面的博客中看到.转自:http://blog.csdn.net/bigloomy/article/details/6633008可能有不少读者会问,字节对齐有必要拿出来单独写一篇博客嘛?我觉得是很有必要,但是它却是被很多人所忽视的一个重点。那么我们使用字节对齐的作用和原因是什么呢?由于硬件平台之间对存储空间的处理上是有很大不同的,一些平台对某些特定类型的数据只能从某些特定地址开始存取,如通常有些架构的CPU要求在编程时必须保证字节对齐,否则访问一个没有进行字节对齐的变量的时候会发生错误。而有些平台可能没有这种情况,但是通常的情况是如果我们编程的时候不按照适合其平台要求对数据存放进行 阅读全文
posted @ 2011-07-27 18:57 hnrainll 阅读(377) 评论(0) 推荐(0)
摘要://如何将一个ASCII码的数据,分解为其两位16进制字符型数据,保存在一个字符数组中#include <stdio.h>#include <string.h>#include <unistd.h>int http_encode(char c,char *out){ int j = 0; char hex_table[16] = "0123456789abcdef"; out[j] = hex_table[c >> 4]; j++; out[j] = hex_table[c & 0x0f]; j++; out[j] = 阅读全文
posted @ 2011-07-27 17:57 hnrainll 阅读(288) 评论(0) 推荐(0)
摘要:/* ************************************************************************ * Filename: main.c * Description: * Version: 1.0 * Created: 2011年07月26日 12时27分27秒 * Revision: none * Compiler: gcc * Author: YOUR NAME (), * Company: * ************************************************************************ 阅读全文
posted @ 2011-07-26 12:31 hnrainll 阅读(1734) 评论(0) 推荐(0)
摘要:1、简介在Linux中,并不存在exec()函数,exec指的是一组函数,一共有6个,分别是:#include <unistd.h>extern char **environ;int execl(const char *path, const char *arg, ...);int execlp(const char *file, const char *arg, ...);int execle(const char *path, const char *arg, ..., char * const envp[]);int execv(const char *path, char 阅读全文
posted @ 2011-07-23 14:41 hnrainll 阅读(24281) 评论(0) 推荐(1)
摘要:fseek函数是用来设定文件的当前读写位置.函数原型: int fseek(FILE*fp,long offset,int origin);函数功能:把fp的文件读写位置指针移到指定的位置.fseek(fp,20,SEEK_SET);意思是把fp文件读写位置指针从文件开始后移20个字节.ftell函数是用来获取文件的当前读写位置;函数原型:long ftell(FILE *fp)函数功能:得到流式文件的当前读写位置,其返回值是当前读写位置偏离文件头部的字节数.ban=ftell(fp);是获取fp指定的文件的当前读写位置,并将其值传给变量ban.fseek函数与ftell函数综合应用:分析:可 阅读全文
posted @ 2011-07-21 16:46 hnrainll 阅读(2780) 评论(0) 推荐(1)