C语言实现Linux的cat命令

模拟实现Linux系统中的cat命令 /* * filename: cat_file.c * 本程序模拟Linux系统中的cat程序,实现的功能: * cat file1 浏览文件1的内容 * cat file1 file2 同时浏览多个文件 * 在程序实现过程中,函数file_copy()实现文件内容的复制 * By linccn 2011.06.06 * */ #include <stdio.h> #include <stdlib.h> void file_copy(FILE *inFile, FILE *outFile) { int c=0; while((c=getc(inFile)) != EOF) putc(c, outFile); } int main(int argc, char *argv[]) { FILE *fp; while(--argc > 0){ if ((fp=fopen(*++argv, "r")) == NULL) { printf("Can't open file\n"); return 1; } else { file_copy(fp, stdout); fclose(fp); } } return 0; }

2015年3月13日 · 1 分钟 · Jid

几个优秀的开源程序

下面是几个代码风格很优秀的开源软件,值得研究学习下源代码: ngix, kernel(BSD), kernel(Linux), mini xml ,lighttp, tor

2015年3月11日 · 1 分钟 · Jid

C/C++ 安全释放指针的方法

代码如下: #include <stdio.h> #include <stdlib.h> #define SAFE_FREE(ptr) { free(ptr); ptr = NULL;} #define SAFE_DEL(ptr) { delete ptr; ptr = NULL;} #define SAFE_DELARR(ptr) { delete [] ptr; ptr = NULL;} int main(int argc, char **argv) { char* p = new char[100]; SAFE_DELARR(p); //system("pause"); return 0; } 实现安全释放指针的机制正是上面的三个宏,其本质就是在释放了指针后,一定要及时地把指针置为NULL。 注意:上面的代码包括了delete, delete[], 因此是段 C++代码。C的话只要第一个宏即可。

2015年3月10日 · 1 分钟 · Jid

获取整数的最大值最小值的宏定义及可能出现的问题

在C/C++编程中时常需要使用整数的最大值最小值,通常这两个常用是跟平台和操作系统有关的,不同的平台会有不同的值,因此可移植的办法就是使用库函数提供的常量定义。 (1)类似的常量定义在limits.h和float.h头文件中,可以查看源文件获取类似常量的使用办法。在头文件中,整数的最值通常是这样的名字:INT_MAX, INT_MIN,直接使用即可。 (2)当然这两个最值完全可以通过编程实现: #define MAX_INT ((unsigned)(-1)>>1) #define MIN_INT (~MAX_INT) 但是,这两个宏仅仅是没有类别的符号,在使用的时候会陷入困境。看下面这段C++程序,输出结果出乎意料。 #include <iostream> #include <limits> #define MAX_INT ((unsigned)(-1)>>1) #define MIN_INT (~MAX_INT) int main() { std::cout << "max_int: " << MAX_INT << "\n" << "min_int: " << MIN_INT << std::endl; } 输出结果是 max_int: 2147483647 min_int: 2147483648 结果怎么会是这样呢? 问题就出在:输出MIN_INT时,由于MIN_INT仅仅是个符号,在输出给cout时就按照Cpp的规则以长整数输出了,因此正确的办法是 cout << "max_int: " << (int)MAX_INT << "\n" << "min_int: " << (int)MIN_INT << endl; 当然最好的办法还是不要使用#define这个宏,不安全。 (3)针对上面的问题,一个比较好的解决办法是,直接定义常量: const int MAX_INT = ((unsigned)(-1))>>1; const int MIN_INT = ~MAX_INT; 示范代码如下: ...

2015年3月3日 · 1 分钟 · Jid

最大公约数 C 语言实现

最大公约数:Greatest Common Divisor,简写为gcd。 这里提供求两个整数最大公约数的计算机算法 辗转相除法(或称欧几里得算法) Stein算法(该算法解决了大数相除的困难) (1)辗转相除法(或称欧几里得算法) 欧几里得算法的依据是数学定理:gcd(y,x)=gcd(y,y%x) (其中y>=x). 下面给出该定理的证明: 由于 y >= x, 可以表示为 y = k*x + b, 其中 k = y/x, b = y%x, 即k和b分别表示商和余数。 下面, 如果一个数(d)能同时被y 和 x 整除, 记为 d|y, d|x, 由 b = y – k*x, 知道 b也能被d整除,即 d|b 同理,如果有整数D能被x 和 b 整除,即 D|x, D|b, 又由y = k*x + b, 知道 y也能被D整除,即 D|y. 现在由上面的推导知道(y, x)和(x, b)的公约数是一样的,即 (y, x)和(x, y%x)的公约数是相同的,那么他们的最大公约数也相同,即 gcd(y,x)=gcd(y,y%x)。 欧几里得算法就依据这个公式:gcd(y,x)=gcd(y,y%x),直到出现余数为零,这时的除数就是最后的最大公约数。 /*C语言实现*/ /*辗转相除法*/ #include <stdio.h> void swap(int *a, int *b) { int tmp; tmp = *a; *a = *b; *b = tmp; } int gcd(int a, int b) { if (a == 0) return b; if (b == 0) return a; if (a < b) swap(&a,&b); int result = a%b; while(result != 0) { a = b; b = result; result = a%b; } return b; } int main() { int m, n; m = 56; n = 108; printf("The greatest common divisor of %d and %d is: %d\n",m,n,gcd(m,n)); return 0; } (2)Stein算法 ...

2015年1月15日 · 2 分钟 · Jid