随笔分类 -  C

摘要:递归降序遍历目录层次结构,并按文件类型计数。 先介绍相关的函数:#includeDIR *opendir(const char *pathname); //打开目录返回值:成功返回指针,出错返回NULLstruct dirent *readdir(DIR *dp); //读取目录 返回值:成功返回指针,出错返回NULLvoid rewinddir(DIR *dp); //重设读取目录的位置为开头位置int closedir(DIR *dp); ... 阅读全文
posted @ 2013-10-02 18:16 net小伙 阅读(510) 评论(0) 推荐(0) 编辑
摘要:1 #include 2 #include 3 #include 4 5 #define MAX 20 6 7 8 typedef struct stack{ 9 char item; 10 struct stack *next; 11 }stack; 12 13 char gettop_s(stack *h) //得到栈顶元素 14 { 15 char ch; 16 17 ch = h->item; 18 19 return ch; 20 } 21 22 stack * out_s(sta... 阅读全文
posted @ 2013-09-26 11:16 net小伙 阅读(297) 评论(0) 推荐(0) 编辑
摘要:十进制转换八进制,二进制,十六进制: 1 #include 2 #include 3 #include 4 5 #define MAX 20 6 7 int bin_val[MAX]; //存放十进制转换成二进制的结果 8 9 int get_int() 10 { 11 int in; 12 while(scanf("%d",&in) == -1){ 13 printf("please input a num\n"); 14 while(getchar() != '\n') ; 15 } 1... 阅读全文
posted @ 2013-09-25 20:28 net小伙 阅读(574) 评论(0) 推荐(0) 编辑
摘要:答案是肯定的,可以一起用。 因为很多人误解了const的真正含义,很多初学者认为const修饰的就是常量,而常量不会改变,而既然不会改变,那volatile就没有意义。 但是实际上这正是对const的误读,const其实只是一种限制约定,也就是某个东西X不能由const修饰的变量来修改,但是这个X仍然可以被其他非const修饰的变量来修改,比如int x;int* p = &x;const int* q = &x;*p=0; //允许*q=0; //错误 虽然p和q指向同一块内存,但是q的const并不能限制p的写入,也就是说const只是限制了q的写入,... 阅读全文
posted @ 2013-09-22 13:05 net小伙 阅读(888) 评论(0) 推荐(1) 编辑
摘要:#include int creat(const char *pathname, mode_t mode); 若成功则返回为只写打开的文件描述符,若出错则返回-1; 有时候我们使用creat函数的时候可能会得不到我们想要的结果。例如:creat("foo",0666) 当我们使用次函数的目的创建一个文件——foo,foo的属性为 -rw-rw-rw-; 但是我们执行完creat函数之后可能会发生其他的结果,笔者的系统是REHL5.1,当我执行完creat函数之后foo的属性为:-rw-r--r--; 这是为什么呢? 如果你想知道为什么,就在命令行里执行umask看一下吧; 阅读全文
posted @ 2013-09-13 18:32 net小伙 阅读(5027) 评论(0) 推荐(0) 编辑
摘要:相信大部分在Unix/Linux下编程的程序员手头上都有《Unix环境高级编程》(APUE)这本超级经典巨著。作者在该书中讲解dup/dup2之前曾经讲过“文件共享”,这对理解dup/dup2还是很有帮助的。这里做简单摘录以备在后面的分析中使用:Stevens said:(1) 每个进程在进程表中都有一个记录项,每个记录项中有一张打开文件描述符表,可将视为一个矢量,每个描述符占用一项。与每个文件描述符相关联的是: (a) 文件描述符标志。 (b) 指向一个文件表项的指针。(2) 内核为所有打开文件维持一张文件表。每个文件表项包含: (a) 文件状态标志(读、写、增写、同步、非阻塞等)。 (b) 阅读全文
posted @ 2013-09-11 16:11 net小伙 阅读(360) 评论(0) 推荐(0) 编辑
摘要:1,fread是带缓冲的,read不带缓冲.2,fopen是标准c里定义的,open是POSIX中定义的.3,fread可以读一个结构.read在linux/unix中读二进制与普通文件没有区别.4,fopen不能指定要创建文件的权限.open可以指定权限.5,fopen返回指针,open返回文件描述符(整数).6,linux/unix中任何设备都是文件,都可以用open,read.如果文件的大小是8k。你如果用read/write,且只分配了2k的缓存,则要将此文件读出需要做4次系统调用来实际从磁盘上读出。如果你用fread/fwrite,则系统自动分配缓存,则读出此文件只要一次系统调用从磁 阅读全文
posted @ 2013-09-10 16:21 net小伙 阅读(3625) 评论(0) 推荐(0) 编辑
摘要:#define GPBCON (*(volatile unsigned long*)0x56000010)1:volatile 当计算机需要一个数值的时候,会先把内存中的值读取到寄存器,然后下次在使用该值的时候就直接读取寄存器中的值了。加上volatile之后,程序就会在每次需要该值的时候都读取一次内存。这是为了防止某些原因硬件会改变其值。2: (volatile unsigned long *)即为强制类型转换;(volatile unsigned long *)0x56000010 的意思就是把0x56000010强制转换为unsigned long类型的指针。这时(volatile .. 阅读全文
posted @ 2013-09-06 10:45 net小伙 阅读(2160) 评论(0) 推荐(0) 编辑
摘要:直接上例子:1.c1 #include2 int main()3 {4 extern int a;5 a += 10;6 printf("%d\n",a);7 text();8 text2();9 }2.c 1 int a = 10; 2 void text() 3 { 4 printf("%d\n",a); 5 } 6 7 void text2() 8 { 9 printf("%d\n",a);10 }输出的结果是202020 阅读全文
posted @ 2013-09-04 22:40 net小伙 阅读(198) 评论(0) 推荐(0) 编辑
摘要:排序二叉树即在构建二叉树的时候就对二叉树进行排序了,当中序遍历二叉树的时候即可得到一个有序的数列; 排序二叉树的规则就是: 若他的左子树不空,则左子树上所有结点的值均小于它的根结构的值; 若他的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树; 从二叉排序树的定义也可以知道,它前提是二叉树,然后它采用了递归的定义方法,再者,它的结点间满足一定得次序关系,左子树结点一定比其双亲结点小,右子树结点一定比其双亲结点打。 代码实现如下: 1 void Create_Sort_Tree(BiTree **t, int value) 2 { 3 ... 阅读全文
posted @ 2013-06-28 21:57 net小伙 阅读(2882) 评论(0) 推荐(0) 编辑
摘要:二叉树的数据结构:1 typedef struct BiTree{2 char item;3 struct BiTree *lchild,*rchild;4 }BiTree; 构建一个二叉树: 为了能让每个结点确认是否有左右孩子,我们要对二叉树进行扩展,变成上图的样子。也就是,将二叉树的每个结点的空指针引出的一个虚节点,其值为一特定值,比如“1”。我们称这种处理后的二叉树为原二叉树的扩展二叉树。 有了扩展二叉树就可以进行二叉树的构建了,笔者选择的是先序构建二叉树: 1 void CreateBiTree(BiTree **T) 2 { 3 char ch; 4... 阅读全文
posted @ 2013-06-28 18:40 net小伙 阅读(1495) 评论(1) 推荐(1) 编辑
摘要:下面的说明摘自于最新的Linux内核2.6.29,说明了strtok()这个函数已经不再使用,由速度更快的strsep()代替/** linux/lib/string.c** Copyright (C) 1991, 1992 Linus Torvalds*//** stupid library routines.. The optimized versions should generally be found* as inline code in ** These are buggy as well..** * Fri Jun 25 1999, Ingo Oeser * - Added st 阅读全文
posted @ 2013-06-22 17:21 net小伙 阅读(490) 评论(0) 推荐(0) 编辑
摘要:写代码之前要先介绍一下可变参数的备用知识; C函数要在程序中用到以下这些宏: void va_start( va_list arg_ptr, prev_param ); type va_arg( va_list arg_ptr, type ); void va_end( va_list arg_pt 阅读全文
posted @ 2013-06-21 16:47 net小伙 阅读(340) 评论(0) 推荐(0) 编辑
摘要:回调函数的一个典型应用就是实现类似C++的泛型算法(Generics Algorithm)。下面实现的max函数可以在任意一组对象中找出最大值,可以是一组int、一组char或者一组结构体,但是实现者并不知道怎样去比较两个对象的大小,调用者需要提供一个做比较操作的回调函数。 1 /* generics.h */ 2 #ifndef GENERICS_H 3 #define GENERICS_H 4 5 typedef int (*cmp_t)(void *, void *); 6 extern void *max(void *data[], int num, cmp_t cmp); 7 ... 阅读全文
posted @ 2013-06-19 18:08 net小伙 阅读(675) 评论(0) 推荐(0) 编辑
摘要:编一个函数,输入一个字符串,要求做一个新字符串,把其中所有的一个或多个连续的空白字符都压缩为一个空格。这里所说的空白包括空格、'\t'、'\n'、'\r'。例如原来的字符串是:This Content hoho is ok ok? file systemuttered words ok ok ?end.压缩了空白之后就是:This Content hoho is ok ok? file system uttered words ok ok ? end. 1 #include <stdio.h> 2 int judge_char(cha 阅读全文
posted @ 2013-06-18 02:31 net小伙 阅读(813) 评论(0) 推荐(0) 编辑
摘要:const限定符和指针结合起来常见的情况有以下几种。const int *a;int const *a;这两种写法是一样的,a是一个指向const int型的指针,a所指向的内存单元不可改写,所以(*a)++是不允许的,但a可以改写,所以a++是允许的。int * const a;a是一个指向int型的const指针,*a是可以改写的,但a不允许改写。int const * const a;a是一个指向const int型的const指针,因此*a和a都不允许改写。指向非const变量的指针或者非const变量的地址可以传给指向const变量的指针,编译器可以做隐式类型转换,例如:char c 阅读全文
posted @ 2013-06-17 01:48 net小伙 阅读(300) 评论(0) 推荐(0) 编辑
摘要:asctime(将时间和日期以字符串格式表示) 相关函数 time,ctime,gmtime,localtime 表头文件 #include<time.h> 定义函数 char * asctime(const struct tm * timeptr); 函数说明 asctime()将参数timeptr所指的tm结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果以字符串形态返回。此函数已经由时区转换成当地时间,字符串格式为:“Wed Jun 30 21:49:08 1993\n” 返回值 若再调用相关的时间日期函数,此字符串可能会被破坏。此函数与ctime不同处在于传入的 阅读全文
posted @ 2013-06-08 10:28 net小伙 阅读(333) 评论(0) 推荐(0) 编辑
摘要:1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 5 typedef struct node 6 { 7 int item; 8 struct node *next; 9 }node; 10 11 typedef struct queue 12 { 13 node *front; 14 node *rear; 15 }queue; 16 17 char getfirst() 18 { 19 char value; 20 value = getc... 阅读全文
posted @ 2013-06-06 10:41 net小伙 阅读(321) 评论(0) 推荐(0) 编辑
摘要:由于是Linux新手,所以现在才开始接触线程编程,照着GUN/Linux编程指南中的一个例子输入编译,结果出现如下错误:undefined reference to 'pthread_create'undefined reference to 'pthread_join'问题原因:pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a,所以在使用pthread_create()创建线程,以及调用 pthread_atfork()函数建立fork处理程序时,需要链接该库。问题解决: 在编译中要加 -lpthread参数 g 阅读全文
posted @ 2013-04-26 22:24 net小伙 阅读(252) 评论(0) 推荐(0) 编辑
摘要:学东西,往往实例才是最让人感兴趣的,老是学基础理论,不动手,感觉没有成就感,呵呵。下面先来一个实例。我们通过创建两个线程来实现对一个数的递加。或许这个实例没有实际运用的价值,但是稍微改动一下,我们就可以用到其他地方去拉。下面是我们的代码: 1 #include <pthread.h> 2 #include <stdio.h> 3 #include <sys/time.h> 4 #include <string.h> 5 #define MAX 10 6 7 pthread_t thread[2]; 8 pthread_mutex_t mut; 9 阅读全文
posted @ 2013-04-26 20:55 net小伙 阅读(289) 评论(0) 推荐(0) 编辑