Archive for 十二月 2012

printf与cout混用输出先后顺序的问题

在代码中若使用了printf与cout,若不注意则会出现输出顺序与预想的不一致的问题。如下代码:

int main()
{
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		std::cout << "i= ";
		printf("%d\n", i);
	}
	return 0;
}

Continue reading ‘printf与cout混用输出先后顺序的问题’ »

多字节字符与宽字符的printf输出

有某些情况需要用到输出多字节字符,而直接使用

printf("%s", xxx);

的方式只能输出第一个字符,例如下面的内存块中保存的宽字符:

0x00294B38  43 00 3a 00 5c 00 57 00 69 00 6e 00 64 00 6f 00 77 00 73 00 5c 00 73 00 79  C.:.\.W.i.n.d.o.w.s.\.s.y
0x00294B51  00 73 00 74 00 65 00 6d 00 33 00 32 00 5c 00 74 00 61 00 73 00 6b 00 68 00  .s.t.e.m.3.2.\.t.a.s.k.h.
0x00294B6A  6f 00 73 00 74 00 2e 00 65 00 78 00 65 00 00 00 cd cd cd cd cd cd cd cd cd  o.s.t...e.x.e...?????????

如果直接使用

printf("%s", xxx);

输出,则会将0x43后面的0x00当作结束符,也就是只会认为只有C字符就结束了,输出的时候会发现,只输出了C后面的内容则没有输出,而且使用

strlen(xxx);

来计算长度也为1。

如果需要完成输出,则需要将printf中的小写s改为大写即可,即

printf("%S", xxx);

如何双击dsw文件快速打开多个VC++6.0工程

在Win7操作系统下,如果是以Administrator登陆,则VC6.0打开工程文件的时候,不能同时打开多个工程文件,后打开的工程会将前一个工程close掉,这样,VC6.0只能出现一个进程。在xp下,我们可以设置文件打开的默认方式中去掉DDE选项,这样可以使得VC6可以同时打开多个工程,但在win7下,却没有办法找到这个设置窗口。经过实践,可以用以下办法解决:

打开cmd:

1)输入assoc .dsp回车,确认后缀为.dsp的文件类型为dspfile;
2)输入assoc .dsw回车,确认后缀为.dsw的文件类型为dswfile;
3)打开vc6的快捷方式的属性,拷贝vc6的路径,注意连两边的双引号都一起拷贝,比如时候这个路径:
“C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\MSDEV.EXE”
4)在cmd窗口,输入ftype dspfile=”C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\MSDEV.EXE” %1
5)在cmd窗口,输入ftype dswfile=”C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\MSDEV.EXE” %1

设置结束,双击不同的工程文件,看是否可同时打开多个工程文件吧。

c++类的基类构造函数

在c++中子类构造时,会先调用基类的构造函数,可以利用此方法,将所有子类中共用的成员变量放入到基类的构造函数中进行初始化,如下代码

class B
{
public:
	B()
	{
		printf("class B construct\n");
	}
	B(int a)
	{
		printf("class B construct a%d\n", a);
	}
	virtual ~B(){}
	virtual int Add(int a, int b);
};

class C : public B
{
public:
	C()
	{
		printf("class C construct\n");
	}
	C(int a)
	{
		printf("class C construct a%d\n", a);
	}
	virtual ~C(){}
	virtual int Add(int a, int b);
};
int main()
{
	B* b = new B;
	B* c = new C(1);
	int result = b->Add(1,2);
	printf("result1:%d\n", result);
	result = c->Add(1,2);
	printf("result2:%d\n", result);
	return 0;
}

Continue reading ‘c++类的基类构造函数’ »