半冷半暖秋天

2010-04-29

printf好危险

Filed under: C/C++ — 标签:, — sunu @ 21:01:43

下午碰到个奇怪的问题,一段从服务器获取文件列表的代码,只要目录里的文件名有%号,就一定会死翘翘。 一开始以为是编码转换时出错,把底层函数全换成Unicode的,结果依旧。

就只有靠一步步打印字符来调试了,结果出在某个自已包装的变参函数上。

	if( NULL != strchr( fmt, '%' ) ) {
		va_list args;
		va_start(args, fmt);
		ret = sp_evbuffer_add_vprintf( mBuffer, fmt, args );
		va_end(args);
	} else {
		ret = append( fmt );
	}

我一直像这样使用这个函数:xxObject->printf(“字符串”),一般情况下是不会有问题,因为中间的字符串都是手输入的,最终变成调用append()去了。但如果字符串是从其它地方获取的,字符串里有%号,这样就出事了。

其实也是懒,不好的习惯,如果老老实实地写成xxxObject->printf(“%s”, someString);就没事了。

使用c标准库里的printf类函数,也是同样,最好不要省掉”%s”格式。

2010-04-26

Visual Assist X

Filed under: 文档及资源 — 标签: — sunu @ 23:02:49

虽然有人说不能过度依赖工具,可是这个工具实在让人太舒心了,不得不用。

Visual Assist X V10.5.1738.0 cracked, VC6~VS2008确实可用。

写php代码的时候,以为没有太好用的IDE,我就傻乎乎地用Editplus一个字一个字地敲了两年。想想这其实是件很痛苦的事情,有时候不得不将屏幕分屏显示,或者不停地Ctrl+F来查找函数,就算是自己写的函数,多半时候我还是记不得叫什么名字的,api就更不用说了。

2010-04-25

荒谬的dropbox

Filed under: 不知所云 — 标签: — sunu @ 10:45:50

开通dropbox没多少时间,网友共享了10G的电子书给我,然后我的空间就爆了,“This is a friendly reminder that you’ve filled your Dropbox to capacity and it can’t sync additional files.”。

这个策略真是荒谬透顶,共享给我的文件怎么可以算在我的头上,又不是完全复制到我的空间,我能完全做主,明明文件及目录还是对方的。唯一好处,估计就是可以以此做为借口,名正言顺地,发一封电子邮件催我快升级到收费用户。

空间是2.5G,但是却使用了10.2G,提示”450% in use”,真是弱智。

当然也有可能是我误解了,但是我也做过类似的系统,如果让我这样的用户误解,那谁会那么善解人意呢?

2010-04-14

sqlite备忘

Filed under: C/C++ — 标签:, — sunu @ 21:01:00

开始的时候为了赶进度,项目中有些地方拿ini做数据库用,现在处理起来超别扭,于是想换成sqlite。

只要会点SQL就基本能使用sqlite了,不过有些语法还是属于sqlite的。语法查询页面:http://www.sqlite.org/lang.html

管理软件:SQLite Database Browser、Sqlite Dev、SQLite Spy

示例大杂烩:

#include "sqlite3.h"
int testSQL()
{
	sqlite3 * db;
	int result;
	char * errmsg = NULL;
	char **dbResult;
	int nRow, nColumn;
	int i,j;
	int index;

	result = sqlite3_open( "./users.db", &db );
	if( result != SQLITE_OK ){
		return -1;
	}

	//创建表
	result = sqlite3_exec( db, "CREATE TABLE [user]([uid] Integer,[name] Char(255) NOT NULL,[gid] Integer NOT NULL,[groups] Char(255) NOT NULL,[password] Char(255) NOT NULL,[disk] Char(255) NOT NULL,[quota] BigInt NOT NULL DEFAULT 0,[email] Char(255) NOT NULL,PRIMARY KEY([uid]))", NULL, NULL, &errmsg );
	if(result != SQLITE_OK ){
		printf("错误码:%d,错误原因:%s\n", result, errmsg );
	}

	//如果要在锁定状态写数据库,先"BEGIN IMMEDIATE",再"END",这样在此期间,其它进程或线程对同一数据库的写操作将被禁止。
	sqlite3_exec( db, "BEGIN IMMEDIATE", NULL, NULL, &errmsg );
	printf("locked\n");
	char sql[1024]="";
	if (1) {
		sprintf(sql, "insert into [user] ('name','gid','groups','password','disk','quota','email') values ('user%d',6000,'6000,7000','3.141590','/opt/xxx/disk', 1024, 'a@b.com')", GetTickCount());
		result = sqlite3_exec( db, sql, NULL, NULL, &errmsg );
		if(result != SQLITE_OK ){
			printf("插入记录失败,错误码:%d,错误原因:%s\n", result, errmsg );
		}
	}
	sqlite3_exec( db, "END", NULL, NULL, &errmsg );
	printf("unlocked\n");

	//刚才插入的记录ID
	int last_id = sqlite3_last_insert_rowid(db);
	printf("last_id=%d\n", last_id);

	//一次性获取所有结果
	result = sqlite3_get_table( db, "select name,email from user limit 0,5", &dbResult, &nRow, &nColumn, &errmsg );
	if( SQLITE_OK == result ){
		index = nColumn;
		printf( "查到%d条记录\n", nRow );
		for( i = 0; i < nRow ; i++ ){
			printf( "%d.\n", i+1 );
			for( j = 0 ; j < nColumn; j++ ){
				printf( "%s\t=>\t%s\n", dbResult[j], dbResult[index] );
				++index;
			}
			printf( "-------------\n" );

			//只为获取某个字段的值
			printf("email=%s\n", dbResult[(i+1)*nColumn + 0] );
		}
	}
	sqlite3_free_table( dbResult );

	//一条条地读记录
	if (1) {
		sqlite3_stmt *st;
		char *sql = "SELECT name from user limit 5";
		result = sqlite3_prepare(db, sql, strlen(sql), &st, 0);
		if (result != SQLITE_OK) {
			fprintf(stderr, "Error on sqlite3_prepare: %s\n", sqlite3_errmsg(db));
		} else {
			for (;;) {
				result = sqlite3_step(st);
				if (result == SQLITE_ROW) {
					int cols = sqlite3_column_count(st);
					//打印当前记录的值
					printf("Result=%s\n", sqlite3_column_text(st, 0) );
				} else if (result == SQLITE_DONE) {
					break;
				} else {
					fprintf(stderr, "Error on sqlite3_step: %s\n", sqlite3_errmsg(db));
				}
			}
		}
		result = sqlite3_finalize(st);
		if (result != SQLITE_OK) {
			fprintf(stderr, "Error on sqlite3_finalize: %s\n", sqlite3_errmsg(db));
		}
	}

	//更新数据
	result = sqlite3_exec( db, "UPDATE [user] SET 'email'='pansunyou@gmail.com'", NULL, NULL, &errmsg );
	if(result != SQLITE_OK ){
		printf("错误码:%d,错误原因:%s\n", result, errmsg );
	}

	//关闭文件
	sqlite3_close( db );

	return 0;
}

2010-04-13

2010/04/13 记事

Filed under: 不知所云 — sunu @ 17:22:10

已经喝了几天的稀饭+八宝粥了,嘴里难受不仅仅是痛,我真他妈够矫情的。

Powered by WordPress