![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
文章平均质量分 86
hbuxiaoshe
这个作者很懒,什么都没留下…
展开
-
mysql_real_connect连接问题
问题描述:使用mysql_real_connect连接数据库时,报错Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)而此时直接使用mysql命令连接数据库可以解决方法:将参数localhost换成127.0.0.1即可原因分析:网上查找发现localhost与127.0.原创 2015-08-04 10:23:55 · 12613 阅读 · 1 评论 -
C语言-unsigned使用误区
<br />先看一段代码:<br />unsigned i;<br />for (i=5; i>=0; i--)<br />{<br /> printf("%u/n", i);<br />}<br />这是个死循环,具体原因是:<br />unsigned变量的取值范围是[0, 232-1],即[0, 4294967295]。<br />所以i值永远不小于0。<br />原创 2010-11-19 15:40:00 · 1154 阅读 · 0 评论 -
C语言-const的使用情况
<br />const int a = 1;<br />int const a = 1;<br />变量a不可修改,需在定义时初始化。<br /> <br />const char *p; // p可变,p指向的数据不可变<br />char const *p; // p可变,p指向的数据不可变<br />char * const p;// p不可变,p指向的数据可变<br />const char * const p; // p不可变,p指向的数据也不可变<br />p可变:p可以指向其他变量;<br /原创 2010-11-19 16:06:00 · 915 阅读 · 0 评论 -
C语言-数组a[]:a与&a的不同
<br />a与&a的不同:<br />a是一个变量,&a是取变量a的地址。<br />对于一个数组int a[8],a与&a的不同在于:<br />a表示的是数组的首地址,即第一个元素的地址,&a表示的是将整个数据看做一个整体时,这个整体数据的地址。<br />a与&a的地址是一样的,但在+1时,就有了不同:<br />a+1表示的是数组第二个元素的地址(&a[1]),而&a+1则表示的地址是a+8,地址偏移了所有的数据。原创 2010-11-19 14:18:00 · 1798 阅读 · 1 评论 -
C语言的全局变量和局部变量
<br />全局变量和局部变量是一个相对的概念,函数体之内定义的变量对于整个程序就是局部变量,对于该函数它就是该函数的“全局变量”。其实,我们不必关心它是全局变量,还是局部变量,只要我们明白它的作用域是什么就可以了。<br />全局变量:函数外(含main函数)定义的变量是整个程序的全局变量,程序中的任何函数都可以使用这些变量。个人认为,全局变量影响函数的封装和移植,影响代码的可读性,不必过多定义。<br />局部变量:函数体内定义的变量,程序调用函数时,创建变量,函数结束后,销毁变量。本函数定义的局部变量原创 2010-11-13 22:26:00 · 1105 阅读 · 0 评论 -
C语言-寄存器和内存
<br />寄存器是CPU内部重要的数据存储资源,主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间,也就是说CPU操作寄存器比操作内存快(寄存器是直接存取,而内存是寻址存取)。<br />汇编比C语言效率高,经常操作寄存器也是一个原因吧。<br /> <br />C语言可以把变量定义为寄存器类型的,将数据直接存放在CPU的寄存器中,使用关键字register定义变量。<br />例如register a=123;定义a为寄存器类型变量。<br /> <br />对于reg原创 2010-11-12 17:05:00 · 8535 阅读 · 2 评论 -
C语言怪异但正确的代码
<br />(1)数组a,a[1]与1[a]等价,可正确编译,可正确运行。<br />因为a[1]被翻译为*(a+1),1[a]被翻译为*(1+a),所以二者是等价的。原创 2011-01-06 17:26:00 · 1245 阅读 · 0 评论 -
C语言内存的动态存储管理4-边界标识法
<br />就空闲链表来说,要确定哪些空闲块是物理地址相邻的,确实不太容易,需要整表扫描。<br />边界标识法能够有效的判断空闲块的物理相邻内存块是否为空闲块。<br />所有的空闲块组成一个双向循环链表,链表中每一个节点的结构如下:<br /><br />llink和rlink分别指向链表中的前驱后继节点。<br />size表明内存块的大小。<br />uplink指向本块的首地址,图中箭头,其作用下面讲述。<br />tag头和尾中各有一个,作为内存块边界的标识,0表空闲块,1表占用块。<br />原创 2010-11-09 22:04:00 · 4532 阅读 · 1 评论 -
C语言内存的动态存储管理3-分配算法和回收
<br />对于内存块大小不同的空闲链表,假如有一个大小为N的内存申请,如果空闲链表中大于N的内存只有一块,假如大小为M,就把M的一部分分配给用户,同时把剩余的M-N的部分作为一个节点插入到空闲链表中。<br />当大于N的内存有多块时,我们该如何分配呢?通常有以下三种方法:<br />(1)最先适配法。顾名思义,顺序扫描空闲链表,找到第一个大于等于N的空闲块,把其中的N分配给用户。因为链表不按内存的地址有序,也不按大小有序,所以回收内存块放到表头即可。<br />问题:运行一段时间后,链表中将会出现一些非原创 2010-11-09 20:39:00 · 5615 阅读 · 0 评论 -
C语言内存的动态存储管理2-空闲链表
<br />空闲链表三种结构形式:<br />(1)所有请求的内存大小相同。这是一种最简单的动态存储管理方式。<br />对此,系统通常的做法是:<br />a)系统启动时,将内存按大小均分成若干个块,并形成一个链表。<br />b)分配时,只需将链表中第一个节点分配给用户即可,无需扫描整个链表。<br />c)回收时,将空闲块插入到链表头即可。<br />(2)所有请求的内存大小有n种规格。可创建n个(1)情况中的链表,分配与回收与(1)类似,不同之处在于:当请求的链表为空时,需要在节点大的链表上进行分配原创 2010-11-08 11:53:00 · 5333 阅读 · 1 评论 -
jsoncpp一个例子
关于json的信息可以去看百度百科http://baike.baidu.com/view/136475.htm。本文写的是,如何使用c++读取json的数据,使用jsoncpp库。先附上代码,之后说明下jsoncpp的使用。// g++ -g -Wall -o test_json test_json.cpp -I./include -L./lib -ljson#includ原创 2013-03-01 17:36:03 · 7168 阅读 · 0 评论 -
根据simhash找出集合中相似文档的算法
google的simhash算法可以用来衡量原始文档的相似程度。如何判断呢?很简单,就是求2个文档的simhash的距离(即二进制数字中不相同的位的个数)。本文不想阐述simhash如何产生、如何计算距离,而是要解决从大量文档中找出相似的文档的问题(我们认为距离为1或2时,两文档相似,为0即相等不考虑)。最笨的方法当然是两两比较了,但是当集合中文档数量很大时,两两比较将会很不现实。那该怎么办呢原创 2013-12-03 22:17:32 · 1591 阅读 · 1 评论 -
mongodb中obj()使用问题
调用obj()时需要注意:同一变量不能调用obj()两次,原创 2014-07-11 23:04:50 · 1901 阅读 · 1 评论 -
不用+、-、×、÷做加法
来自:http://zhedahht.blog.163.com/其中有一题是:不用+、-、×、÷做加法。楼主给出了位运算方法,如下:int AddWithoutArithmetic(int num1, int num2) { // 利用异或,与操作,递归调用 if (num2 == 0) return num1; int sum = num1 ^ num2;转载 2015-07-21 09:26:43 · 672 阅读 · 0 评论 -
leveldb使用时遇到的性能问题
我用leveldb+thrift做了个存储服务,实现了跨进程的数据读写。但随着数据量的增大,我发现数据更新越来越慢。经过排查发现为leveldb使用问题,有问题的逻辑是:服务端每收到一条更新操作,都先查询该数据是否已经存在。后修改为不查询直接写,性能大幅提升(约5倍提升)。切记!下面其他参数也尝试了,感觉无明显提升(没有数据支持,并不能说明什么):write_buffer_size:默认4原创 2015-07-21 10:43:02 · 4580 阅读 · 0 评论 -
百度图片url解码
使用query词抓取百度图片数据的时候,为了简化抓取,使用firebug跟踪到百度图片请求返回了一个json格式数据,例如http://image.baidu.com/i?tn=resultjson_com&ie=gbk&word=%B7%B6%B1%F9%B1%F9&cg=girl&pn=0&rn=60(该url已简化)。我们只需抓取这个json数据即可,但是这个json格式中的objectUr原创 2015-03-31 16:15:41 · 13611 阅读 · 2 评论 -
初次使用SpiderMonkey
初次使用SpiderMonkey,对它了解并不多,所以它是什么,请自行去搜索。本文只讲述我们用SpiderMonkey能做什么,我们可以用c/c++调用SpiderMonkey的接口,去执行JavaScript代码。这听起来是不是很酷,现在一起开始吧。安装我在linux下,安装很简单,去http://ftp.mozilla.org/pub/mozilla.org/js/下载源码包js-1.原创 2015-03-17 18:30:42 · 5085 阅读 · 0 评论 -
c语言调用iconv忽略不可识别的字符
网上抓来的html数据经常需要进行转码(utf8和gbk互转等),总会出现特殊字符造成 iconv转码失败的情况,例如http://app.tongbu.com/bizhi/newipad/cateshow-1-0-1-515427.html,数据是utf8,如果转换为其他格式编码就会出错。如果不解决这个问题,整个网站都将转码失败。解决这个问题的方法很简单,只需在目标编码后面加上 //IGNO原创 2015-03-26 15:56:00 · 4596 阅读 · 0 评论 -
动态规划求解最长公共子序列
子序列假定字符原创 2014-10-24 17:41:24 · 1006 阅读 · 0 评论 -
thrift数据类型不同引起的传输问题
下面都是实验通过的。(1)原创 2014-08-29 22:49:38 · 5544 阅读 · 1 评论 -
相似哈希simhash计算
simhash计算原理:原创 2014-08-15 13:06:38 · 3131 阅读 · 2 评论 -
蓄水池随机抽样算法
问题描述:处理逻辑:证明:用处:原创 2014-08-18 11:57:46 · 1744 阅读 · 0 评论 -
C语言内存的动态存储管理1-概述
<br />动态存储管理的基本问题是:系统如何按请求分配内存,如何回收内存再利用。提出请求的用户可能是系统的一个作业,也可能是程序中的一个变量。<br />空闲块<br />未曾分配的地址连续的内存区称为“空闲块”。<br />占用块<br />已分配给用户使用的地址连续的内存区称为“占用块”。<br /> <br />系统刚刚启动时,整个内存可看做一个大的“空闲块”,随着用户请求的进入,系统依次分配相应的内存。<br />在系统运行过程中,内存被分为两大部分:低地址区(若干占用块)和高地址区(空闲块)。<原创 2010-11-08 10:37:00 · 1921 阅读 · 0 评论 -
C语言指针4-内存的灵活操作
<br />使用指针操作内存是非常灵活的。<br />(1)我们定义的任何一个类型的任何一个变量,在程序运行时都占用一定的内存空间。<br />(2)指针的sizeof大小都是4字节(32位),可以指向任何内存空间,可以做任何类型的强制转换。<br />(3)当我们定义的指针不知是何类型时,可以使用void *(其实任何类型都可以),如malloc的返回值(void *)。<br />(4)内存操作一般使用memcpy函数。与strcpy不同在于:memcpy不会遇到0结束,一定会拷贝n个字节的数据。0即'原创 2010-11-06 12:08:00 · 1239 阅读 · 0 评论 -
线段树的应用-poj2777的解法
<br />poj2777的问题描述:<br />给一个板子染色,板子长L,均分成L段,分别标记为1,2, ..., L,每段只能染一个颜色(颜色种类很少,<=30)。<br />有两种操作:<br />(1)C A B C:从段A到段B,染C颜色。<br />(2)P A B:查询输出段A到段B共有几种不同的颜色。<br />线段树代码:<br />#include <stdio.h>#define LEN 100000#define COLOR 1typedef struct seg原创 2010-08-11 14:59:00 · 875 阅读 · 0 评论 -
线段树的应用-poj3264的解法
<br />将poj3264表述成一句话,就是:<br />在一组数中,查询某个区间内的最大数与最小数的差。<br />poj3264的原文地址为:http://acm.pku.edu.cn/JudgeOnline/problem?id=3264<br /> <br />解此题需要用到线段树,树中一个节点对应一个区间,每个节点都需要存储该区间的最大数和最小数,代码如下:<br /> <br />#include <stdio.h>#include <string.h>#define MIN 0原创 2010-08-10 16:53:00 · 3028 阅读 · 0 评论 -
线段树的应用-poj3468的解法
<br />poj3468的问题描述:<br />给定一组数字A1, A2, ..., AN,在这个数组上有两种操作:<br />(1)C a b c,将数字c加到区间[a,b]表示的每一个数上<br />(2)Q a b,查询区间[a,b]表示的所有数的和,输出这个和值。<br />注意,和值有可能大于2的32次方。<br /> <br />线段树的代码:<br />#include <stdio.h>#define LEN 100000typedef __int64 int64;type原创 2010-08-11 10:32:00 · 926 阅读 · 0 评论 -
快速排序qsort的使用
表头文件 #include 定义函数 void qsort(void * base,size_t nmemb,size_t size,int ( * compar)(const void *, const void *));函数说明 参数base指向欲排序的数组开头地址,参数nmemb代表数组中的元素数量, 每一元素的大小则由参数size决定,最后一项参数compar为一函数指针, 这个函数用来判断两个元素间的大小关系, 若传给compar的第一个参数所指的元素数据大于第二个参数所指原创 2010-08-02 11:13:00 · 717 阅读 · 0 评论 -
C语言指针2-指针的加减
<br /> 指针是一个变量,存储的是一个32位的数值(地址),也可参与计算,比如指针p++, p--, p+= sizeof(int)等,但只能用于连续存储空间。<br /> p++,p--:指针p移动一个单位,这个单位大小是多少,要看p的数据类型了。如p是一个char型的,则p++移动一个字节,如果有int *p;则p++移动4个字节。<br /> 如果是自定义类型,代码:<br /> typedef struct point{ double x; double y;原创 2010-08-03 16:20:00 · 3053 阅读 · 0 评论 -
汉诺塔-递归算法
<br />柱子x,y,z,x上有n个圆盘,将n从x移动到z。<br />代码:<br />/* move n disks from 'x' to 'z' */HanoiMove(int n, char x, char y, char z){ if (n == 1) printf("%2d: %c -> %c/n", n, x, z); else { HanoiMove(n-1, x, z, y); printf("%2d: %c -> %c/n", n, x, z)原创 2010-08-02 15:25:00 · 791 阅读 · 0 评论 -
C语言指针1-定义
指针是一个变量,存储的是另一个变量的地址。例如,有如下代码:int a = 3;int *ptr = &a;//定义一个指向整形的指针,变量前加一个*即为一个指针变量可以这么理解,定义变量a后,系统为a分配一个大小为sizeof(int)的空间,该空间的地址存放在变量ptr中。如果printf("%p", ptr);则打印输出0xbfb12000。用图表示即为:区分变量与指针变量:int a;float b;double c;char d;char e[8];float *f = &b;char *g= "原创 2010-08-03 15:50:00 · 6322 阅读 · 0 评论 -
最大公约数和最小公倍数
两个数的最大公约数和最小公倍数的代码:最大公约数:int Gcd(int a, int b){ int t; while (b != 0) { t = a % b; a = b; b = t; } return a;}最小公倍数:int Lcm(int a, int b){ return a/Gcd(a, b) * b;}原创 2010-08-02 15:21:00 · 483 阅读 · 0 评论 -
printf实现动态显示
<br />(1)显示百分比,代码如下:<br />#include <stdio.h>int main(){ int i; for (i=0; i<20; i++) { printf("/rxiaoshe [%d%%]", (i+1)*5); fflush(stdout); sleep(1); } printf("/n"); return 0;} <br />运行效果为:<br />xiaoshe [75%]<br />原创 2010-07-10 18:18:00 · 4372 阅读 · 3 评论 -
C语言指针3-函数指针
函数指针是一个指向函数的指针,可以如下定义:int (*pfunc)(int, int);对这条语句的解释是:先解释(*pfunc),所以pfunc首先是一个指针;再解释(int, int),pfunc指向一个函数,该函数的参数有两个,都是整形;最后是返回值。因此,如果定义了一个函数int max(int a, int b),我们就可以这样使用函数指针了:pfunc = max; // 注意二者的返回类型,需要一致函数指针与指针函数是不一样的,后者是一个函数,其返回值是一个指针,比如char *原创 2010-09-07 14:14:00 · 1533 阅读 · 0 评论 -
快速排序算法
<br />快速排序的基本思想是:从待排序列中任取一个,作为支点。凡关键字小于支点的记录均移动至支点之前,大于支点的记录均移动至支点之后。经过一趟排序后,待排序列将分割成两个子序列,分别进行上述操作。<br />一趟快速排序的具体做法是:设置两个指针i和j,分别指示待排序列的左侧记录位置和右侧记录位置,首先从j所指位置开始向前查找关键字小于支点的记录,与支点交换;再从i所指位置开始向后查找关键字大于支点的记录,与支点交换,反复执行,直到i与j相等。<br />快速排序示例如下图:<br /><br />每次原创 2010-09-26 20:56:00 · 923 阅读 · 0 评论 -
直接选择排序
<br />将待排序列看成左右两个子序列,左子序列是有序的,右子序列是无序的,并且左序列中最大关键字(在左序列的最右边)小于右序列的最小关键字。排序的过程为:定义某个变量i指向最大关键字的下一个位置,在右序列中找到最小关键字k,将i和k交换。<br />代码如下:/* 直接选择排序 */void StraightSelectionSort(int a[], int n){ int i, j, k, tmp; for (i=0; i<n-1; i++) { k = i; // a[0原创 2010-09-27 20:40:00 · 554 阅读 · 0 评论 -
C语言参数传递
<br />C语言的参数传递方式有两种:值传递和地址传递(或指针传递)。<br />值传递:<br />(1)采用值传递方式传递的变量(形参)是实参的“拷贝”,是函数的局部变量。<br />(2)函数结束后,局部变量虽然达到预期的改变,但其空间将自动释放,其值将被丢弃。<br />例1,我们定义如下函数:<br />void swap(int a, int b)<br />{<br /> int t = a;<br /> a = b;<br /> b = t;<br />}<br />当我们使用语句swap原创 2010-11-06 10:36:00 · 1835 阅读 · 0 评论 -
double类型相等判断
计算机判断两个数相等,将判断所有的二进制位是否相等,当所有的位都相等时,两个数才相等,绝对的相等。但人们对小数来说,保留小数点后几位就足够了,因此两个小数的差在可接受的精度范围内就可以被认为是相等的。/* a == b*/int dequals(double a, double b){ return fabs(a-b)原创 2010-10-26 21:38:00 · 21918 阅读 · 7 评论 -
C语言相关的几个疑惑
<br />(1)C语言的创立<br />早期的UNIX是用汇编语言编写的,但很笨拙,系统难以调试,理解困难。Thompson想利用高级语言的一些优点,几经尝试后创建了B语言。B语言是对BCPL的简化,常驻内存。由于内存的限制,内存中只能放置解释器,而不是编译器,效率低下,同时,B语言无法表达不同的数据类型。Dennis Retchie利用PDP-11的强大性能,创立了能够同时解决多种数据类型和效率的“New B“语言。这个名字很快就变成了"C",这就是C语言。<br />BCPL:基本组合编程语言原创 2010-12-17 13:07:00 · 1206 阅读 · 0 评论 -
如何将C语言代码转换为对应的汇编代码?
<br />VC6.0下有两种方法:<br />(1)增加参数/FA:Project->Setting...,C/C++选项卡中的Project Options中增加参数/FA,编译后debug目录中将会增加对应源文件的汇编文件(*.asm)。<br />(2)如果想查看C语句对应的汇编代码的话,可以这样:F11单步调试,在debug工具栏中选择“disassembly”即可。每行C代码下面就是对应的汇编代码。<br />如果debug工具栏不见了,可在VC上方空白菜单处右键,选择“debug”即可弹出de原创 2010-12-14 11:06:00 · 49845 阅读 · 0 评论