C
文章平均质量分 55
dingyuanpu
QQ:d-y-p@qq.com
展开
-
C程序设计的常用算法
算法(Algorithm):计算机解题的基本思想方法和步骤。算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。通常使用自然语言、结构化流程图、伪代码等来描述算法。 一、计数、求和、求阶乘等简单算法 此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件原创 2010-05-09 17:20:00 · 685 阅读 · 0 评论 -
可变参数举例
<br />/*<br />** 计算指定数量的值的平均值<br />*/<br />#include<stdio.h><br />#include<stdarg.h><br /> <br />float average(int n_values, ... )<br />{<br /> va_list var_arg; //va_list = void *<br /> int count = 0; //可变参数的数目<br /> int sum = n_values;原创 2010-08-13 12:55:00 · 558 阅读 · 0 评论 -
错误的字符串比较
<br />#include<stdio.h><br /> <br />int isequiv(char *t) <br />{ <br /> printf("%d/n", t);<br /> <br /> if (t == "char")//比较的是地址 <br /> return 1; <br /> else <br /> return 0; <br />} <br /> <br />int m原创 2010-08-13 12:56:00 · 613 阅读 · 0 评论 -
字符串拷贝函数的满分实现
<br />#include<stdio.h><br />#include <assert.h><br />#include<string.h><br /> <br />//为了实现链式操作,将目的地址返回<br />char *copy( char *strDest, const char *strSrc ) <br />{ <br /> char *address = strDest; <br /> <br /> //宏assert()(assert.h)用于错误检测。如原创 2010-08-13 12:59:00 · 1349 阅读 · 0 评论 -
strtok函数的用法
<br />#include <stdio.h><br />#include <string.h><br /> <br />void print_tokens(char *str)<br />{<br /> int count = 0;<br /> char *word;<br /> char witespace[] = " /n/r/f/t/v";<br /> <br /> //如果stork函数的第一个参数不是NULL,函数将找到的字符串的第一个标记。同时原创 2010-08-13 13:05:00 · 1587 阅读 · 0 评论 -
快排qsort程序举例
<br />#include <stdio.h><br />#include <stdlib.h><br />#include <string.h><br /> <br />int sort_function( const void *a, const void *b);<br /> <br />int list[5] = { 3, 1, 5, 3, 6};<br /> <br /><br />int main(void)<br />{<br /> int x;<br /> <br /> qsor原创 2010-08-13 13:07:00 · 736 阅读 · 0 评论 -
用clock函数测试机器catch的作用
<br />/*<br />** 测试catch的程序<br />*/<br />#include <stdio.h><br />#include <string.h><br />#include <time.h><br /> <br />#define DUMBCOPY for(i = 0; i < 65536; i++) /<br /> destination[i] = source[i]<br /> <br />#define SMARTCOPY memcpy(destina原创 2010-08-13 13:10:00 · 634 阅读 · 0 评论 -
二分法搜索bsearch使用举例
<br />#include <stdlib.h><br />#include <stdio.h><br /> <br />#define NELEMS(arr) (sizeof(arr) / sizeof(arr[0]))<br /> <br />int numarray[] = {123, 145, 512, 627, 800, 933};<br /> <br />int numeric (const int *p1, const int *p2)<br />{<br /> return(*p1 -原创 2010-08-13 13:15:00 · 757 阅读 · 0 评论 -
fprintf/fscanf函数使用举例
<br />#include <stdio.h><br />#include <stdlib.h><br /> <br />int main()<br />{<br /> FILE *fp;<br /> int i,ss[4],new[4];<br /> <br /> for(i=0;i<4;i++)<br /> {<br /> scanf("%d",&ss[i]);<br /> }<br /> <br />原创 2010-08-13 13:18:00 · 2222 阅读 · 0 评论 -
realloc/setjmp函数使用举例
<br />/*<br />** 增加内存<br />*/<br />#include <stdio.h><br />#include <stdlib.h><br />#include <setjmp.h><br /> <br />#define N 5<br /> <br />jmp_buf buf;<br /> <br />void func()<br />{<br /> int *p, *pa = NULL;<br /> int i;<br /> <br />原创 2010-08-13 13:20:00 · 536 阅读 · 0 评论 -
setjmp/longjmp函数使用举例
<br />#include <stdio.h><br />#include <stdlib.h><br />#include <setjmp.h><br /> <br />jmp_buf buf;<br /> <br />void banana(int i)<br />{<br /> printf("in banana() : ");<br /> <br /> switch(i)<br /> {<br /> case 1:<br />原创 2010-08-13 13:22:00 · 604 阅读 · 0 评论 -
signal/setjmp函数使用举例
<br />#include <setjmp.h><br />#include <signal.h><br />#include <stdio.h><br /> <br />jmp_buf buf;<br /> <br />void handler(int s)<br />{<br /> if(SIGINT == s)<br /> {<br /> printf("now got a SIGINT signal/n");<br /> }<br />原创 2010-08-13 13:23:00 · 804 阅读 · 0 评论 -
泛型堆栈的c实现
<br />f_stack.h:<br />#include <assert.h><br /> <br />#define GENERIC_STACK( STACK_TYPE, SUFFIX, STACK_SIZE ) /<br /> /<br /> static STACK_T原创 2010-08-13 13:31:00 · 770 阅读 · 0 评论 -
定义安全malloc
<br />alloc.h<br />/*<br />**定义一个不易发生错误的内存分配器<br />*/<br />#include<stdlib.h><br /> <br />#define malloc 不直接调用malloc!<br />#define MALLOC(num, type) (type *)alloc((num) * sizeof(type))<br /> <br />extern void *alloc(size_t size);<br /> <br />alloc.c<br />/原创 2010-08-13 13:35:00 · 1412 阅读 · 1 评论 -
c小结--听课笔记
1、 C是基于操作系统的2、 对于一个malloc指针也可以free,但是会出现内存错误(如段错误)3、 str[3]等价于3[str]等价于*(str+3),因为[ ]是进行地址运算4、 char[] dig(char[] str)等价于 char* dig(char* str)5、 递归调用会出现耗尽内存(栈内存),必须要有结束条件。因为函数如果不返回,栈内存就不会释放6、 相同性质的一堆数据叫段7、 指针没有类型,或只有指针类型8、 struct里声明一个函数类型指针就是声明了一个函数原创 2010-09-19 17:17:00 · 741 阅读 · 0 评论 -
c语言头文件的作用
最近在工作当中遇到了一点小问题,关于C语言头文件的应用问题,主要还是关于全局变量的定义和声明问题.学习C语言已经有好几年了,工作使用也近半年了,但是对于这部分的东西的确还没有深入的思考过.概念上还是比较模糊的,只是之前的使用大多比较简单,并没有牵涉到太复杂的工程,所以定义和声明还是比较简单而明了了的.但是最近的大工程让我在这方面吃到了一点点苦头,虽然看了别人的代码能够很快的改正,但是这些改正背后的原因却不知道.我想大多数喜欢C语言的程序员应该是和我一样的,总喜欢去追究程序问题背后的底层原因,而这也恰恰是我喜转载 2010-10-15 08:30:00 · 838 阅读 · 0 评论 -
实现--从文件中随机提取一个字符串
#include #include #include #include #define random(x) (rand() % x) //产生x内的随机函数#define RAND_N 1000//自定义随机器void my_random(ch原创 2010-08-10 13:36:00 · 2078 阅读 · 0 评论 -
宏定义/#argument/##
<br />/*<br />** 程序1<br />*/<br />#include <stdio.h><br /> <br />#define PRINT(FORMAT, VALUE) / <br /> printf("The value of " #VALUE " is " FORMAT "/n", VALUE); /<br /> printf("The value is: " FORMAT "/n", VALUE)<br />原创 2010-08-13 12:51:00 · 612 阅读 · 0 评论 -
const在c/c++中的区别
C++中的const正常情况下是看成编译期的常量,编译器并不为const分配空间,只是在编译的时候将期值保存在名字表中,并在适当的时候折合在代码中.所以,以下代码:<br />#include <iostream><br />using namespace std;<br />int main()<br />{<br /> const int a = 1;<br /> const int b = 2;<br /> int array[ a + b ] = {0};<br /> for (int i = 0;原创 2010-08-12 16:21:00 · 5695 阅读 · 1 评论 -
位段举例
<br />#include <stdio.h> <br /> <br />typedef struct tagRGB<br />{ <br /> unsigned r:8; <br /> unsigned g:8; <br /> unsigned b:8; <br />}RGB; <br /> <br />void main() <br />{ <br /> RGB color;<br /> color.r=10; <br />原创 2010-08-11 22:12:00 · 619 阅读 · 0 评论 -
C中的空
1. 什么是空指针常量(null pointer constant)?[ 6.3.2.3-3] An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.这里告诉我们:0、0L、/0、3 - 3原创 2010-05-09 17:21:00 · 644 阅读 · 0 评论 -
C语言可变参数函数分析与实现
1,首先,怎么得到参数的值。对于一般的函数,我们可以通过参数对应在参数列表里的标识符来得到。但是参数可变函数那些可变的参数是没有参数标识符的,它只有“…”,所以通过标识符来得到是不可能的,我们只有另辟途径。我们知道函数调用时都会分配栈空间,而函数调用机制中的栈结构如下图所示:| ...... |------------------| 参数2 |------------------| 参数1 |------------------| 返回地址 |转载 2010-07-23 11:05:00 · 931 阅读 · 0 评论 -
关于字符指针与常量
我相信,使用C/C++多年的人对下面这个字符串赋值语句都不会陌生吧。 char* p = "test";同时,我也相信,各位在使用这种语句后吃过很多苦头也不少吧?只要你想利用指针p来改变字符串的内容,你的程序都会得到一个让你颜面尽失一个内存非法操作。比如,下面的这些语句: p[0] = 's'; strcpy(p, "haoel");原因就在于,char* p = "test"; 这个声明,声明了一个指针,而这个指针指向的是转载 2010-07-24 09:34:00 · 728 阅读 · 0 评论 -
零长度数组
零长度数组 -- 神奇的int reserve[0]#include #include struct device{ int num; int count; int reserve[0]; //reserve是一个数组名;该数组没有元素;该数组的其实地址}; //紧随结构题device之后;这种声明方法可以巧妙的实现C语言里的数组扩展int main(){ struct device * p_dev = (struct dev转载 2010-07-24 11:06:00 · 542 阅读 · 0 评论 -
位段【C语言】
1.什么是位段在大多数的计算机系统中, 一个字节是由八个更小的, 称作为位的单位组成的。位是比字节更小的单位。位只有两个值, 1 或 0 。因此, 存储在计算机存储器中的一个字节可以看成由八个二进制数字形成的串。例如, 一个存放值 36 的字节是八个二进制数字的串: 可以表示成 00100100。 存入值24 的字节可以表示成 00010100。有时, 我们希望不仅对字节进行操作, 也要能对位进行操作。例如, 用布尔真或假条件表示的标志, 在计算机中可用位来表示。但是, 说明一个用作标志的普通变量至少要用一转载 2010-07-26 18:53:00 · 647 阅读 · 0 评论 -
do...while(0)的妙用
在C++中,有三种类型的循环语句:for, while, 和do...while, 但是在一般应用中作循环时, 我们可能用for和while要多一些,do...while相对不受重视。 但是,最近在读我们项目的代码时,却发现了do...while的一些十分聪明的用法,不是用来做循环,而是用作其他来提高代码的健壮性。 1. do...while(0)消除goto语句。通常,如果在一个函数中开始要分配一些资源,然后在中途执行过程中如果遇到错误则退出函数,当然,退出前先释放资源,我们的代码可能是这样:ver转载 2010-07-28 13:57:00 · 441 阅读 · 0 评论 -
C/C++宏带来的奇技淫巧
众多C++书籍都忠告我们C语言宏是万恶之首,但事情总不如我们想象的那么坏,就如同goto一样。宏有一个很大的作用,就是自动为我们产生代码。如果说模板可以为我们产生各种型别的代码(型别替换),那么宏其实可以为我们在符号上产生新的代码(即符号替换、增加)。关于宏的一些语法问题,可以在google上找到。相信我,你对于宏的了解绝对没你想象的那么多。如果你还不知道#和##,也不知道prescan,那么你肯定对宏的了解不够。我稍微讲解下宏的一些语法问题(说语法问题似乎不妥,macro只与preprocessor有关,转载 2010-07-28 13:45:00 · 423 阅读 · 0 评论 -
函数名与函数指针
一 通常的函数调用一个通常的函数调用的例子://自行包含头文件void MyFun(int x); //此处的申明也可写成:void MyFun( int );int main(int argc, char* argv[]){ MyFun(10); //这里是调用MyFun(10);函数 return 0;}void MyFun(int x) //这里定义一个MyFun函数{ printf(“%d/n”,x);} 这个MyFun函数是一个无返回值的函数,它并不完成什么转载 2010-07-28 14:31:00 · 481 阅读 · 0 评论 -
揭开setjmp/longjmp的迷雾
setjmp与logjmp包含在头文件/usr/include/setjmp.h中,使用前应在程序头部加入#include 。setjmp与longjmp结合使用时,它们必须有严格的先后执行顺序,也即先调用setjmp函数,之后再调用longjmp函数,以恢复到先前被保存的“程序执行点”。否则,如果在setjmp调用之前,执行longjmp函数,将导致程序的执行流变的不可预测,很容易导致程序崩溃而退出。setjmp与longjmp的作用同goto语句类似,它能实现本地的跳转.一、setjmp与logjmp的转载 2010-07-30 18:08:00 · 2944 阅读 · 0 评论 -
诡异的多维数组传递
#include #include //void f1(int a[][2][2])void f1(int (*a)[2][2]){ printf("%d/n", a[0][1][0]);}void f2(int *a){ int (*b)[2][2]= (int(*)[2][2])a; //强制类型转换 printf("%d/n", b[0][1][0]);}void main(){ int a[2][2][2] = {1, 2, 3, 4, 5, 6, 7, 8};原创 2010-08-07 21:24:00 · 420 阅读 · 0 评论 -
不用临时变量的交换
#include <stdio.h>void main()<br />{<br /> int a = 5, b = 4; printf("a = %d b = %d/n", a, b); a ^= b;<br /> b ^= a;<br /> a ^= b; printf("a = %d b = %d/n", a, b);<br />}原创 2010-08-08 16:34:00 · 405 阅读 · 0 评论 -
使用指针从函数返回一个二维数组
#include #include int (*func())[20];int main(void){ int (*result)[20]; int i; result = func(); for(i = 0; i { printf("%d/n", (*result)[i]); } free(result); return 0;}int (*func())[20]{ int (*a)[20]; //声明一个指向包含2原创 2010-08-07 21:16:00 · 3659 阅读 · 0 评论 -
~0 == -1
<br />在c中,对一个数求反,并不是求这个数的反码。<br />假设int类型是16位,则sined int的范围是-32768 ~ 32767(-2^15 ~ 2^15 - 1),即:<br />1000 0000 0000 0000 ~ 0111 1111 1111 1111<br />这个范围可分为3段:<br />负:1000 0000 0000 0000 ~ 1111 1111 1111 1111 (-32768 ~ -1)<br />零:0000 0000 0000 0000<br原创 2010-08-09 10:43:00 · 2363 阅读 · 0 评论 -
C/C++中怎样产生随机数
C语言/C++怎样产生随机数:这里要用到的是rand()函数, srand()函数,C语言/C++里没有自带的random(int number)函数。(1) 如果你只要产生随机数而不需要设定范围的话,你只要用rand()就可以了:rand()会返回一随机数值, 范围在0至RAND_MAX 间。RAND_MAX定义在stdlib.h, 其值为2147483647。例如:#include#includevoid main(){ for(int i=0;i printf("%d/n",rand转载 2010-08-10 10:45:00 · 699 阅读 · 0 评论 -
缓冲输出与内存分配
<br />程序输出有两种方式:一种是即时处理方式,另一种是先暂时存起来,然后再大块写入的方<br />式,前者往往造成较高的系统负担。因此,C语言实现通常都允许程序员进行实际的写操作<br />之前控制产生的输出数据量。<br />setbuf(stdout, buf);<br />此语句通知输入输出库,所有写入到stdout的输出都应该使用buf作为输出缓冲区,直到buf<br />缓冲区被填满或者程序员直接调用fflush(对于由写操作打开的文件,调用fflush将导致输<br />出缓冲区的内容被实原创 2010-08-11 08:42:00 · 759 阅读 · 0 评论 -
C再学笔记
C语言内存分为五个区:1、栈:用来存放函数的形参和函数内的局部变量。由编译器分配空间,在函数执行完后由编译器自动释放。2、堆:用来存放由动态分配函数(如malloc)分配的空间。是由程序员自己手动分配的,并且必须由程序员使用free释放。如果忘记用free释放,会导致所分配的空间一直占着不放,导致内存泄露。3、全局局:用来存放全局变量和静态变量。存在于程序的整个运行期间,是由编译器分配和释放的。4、文字常量区:例如char *c = “123456”;则”123456”为文字常量,存放于文字常量区。也由编译原创 2010-08-11 15:30:00 · 739 阅读 · 0 评论 -
火柴棍移动的一道面试题
最近有朋友找工作,面试某公司,遇到一个火柴棍移动的面试题,感觉有点意思,在此抛砖引玉。题目大致是这样的:一个三个数的式子,移动其中一根火柴,使等式成立,用程序实现,输出能成立的等式。注:“+”可以移走一根火柴变成“-”例如:废话不说,直接上代码,哪位网友有更好的方法,请分享一下,多谢#include /* 定义操作符号,"+"或"-" */#d原创 2014-08-12 22:19:53 · 7103 阅读 · 2 评论