codeproject:CString Management通过阅读本文你可以学习如何有效地使用 CString。"> 原著:Joseph M. Newcomer翻译:littleloach原文出处:asp" target="_blank">codeproject:CString Management通过阅读本文你可以学习如何有效地使用 CString。_IT技术专题(CString 操作指南 )
    当前位置:首页 » 软件开发
开发技术指南» 文章正文
    引言: 原著:Joseph M. Newcomer翻译:littleloach原文出处:asp" target="_blank">codeproject:CString Management通过阅读本文你可以学习如何有效地使用 CString。
 

 

    摘要:嗅探器(sniffer)一直以来都是一种让人恼火的黑客工具,因为它是一种静态的攻击软件,它的存在不会留下任何痕迹,因此人们很难将它揪出来。可是,它的危害性却又是相当大的(它就像一个监视器,你的“一举一动”都在它的监视之下,你说危害大不大)。所以,我们不能不要想个办法出来检查网络中是否存在sniffer,这是非常必要的。1. sniffer原理所谓知己知彼方能百战不殆,要了解......
    摘要:vc6.0中基于msflexgrid的可编辑表格的制作及其若干问题的解决方案 一、 概述在我们制作的用户界面中很多时候会用到表格,当然我们首先想到的是用控件,如msflexgrid。我们可以方便的调用控件自身的函数来对表格中的元素进行操作,但是如果要设计一个可以编辑的表格,我们该怎么办呢?事实上这种可编辑表格的应用还真的不少,主要是其用户操作的交互性较好。笔者在前一阶段开发项目时遇到了这个问题,......


CString 操作指南
原著:joseph m. newcomer翻译:littleloach

原文出处:asp" target="_blank">codeproject:cstring management通过阅读本文你可以学习如何有效地使用 cstring.  cstring 是一种很有用的数据类型.它们很大程度上简化了mfc中的许多操作,使得mfc在做字符串操作的时候方便了很多.不管怎样,使用cstring有很多特殊的技巧,特别是对于纯c背景下走出来的程序员来说有点难以学习.这篇文章就来讨论这些技巧.  使用cstring可以让你对字符串的操作更加直截了当.这篇文章不是cstring的完全手册,但囊括了大部分常见基本问题.这篇文章包括以下内容:

字符串">格式化字符串(包括 int 型转化为 cstring ) cstring 型转化成 int 型 cstring 型与 char* 类型的相互转化char* 转化成 cstring cstring 转化成 char* 之一:使用lpctstr强制转化 cstring 转化成 char* 之二:使用cstring对象的getbuffer方法 cstring 转化成 char* 之三: 与控件的接口cstring 型转化成 bstr 型; bstr 型转化成 cstring 型; variant 型转化成 cstring 型; 字符串表资源">载入字符串表资源; cstring 与临时对象; cstring 的效率; 总结

下面我分别讨论. 1.cstring 对象的连接  能体现出 cstring 类型方便性特点的一个方面就字符串的连接,使用 cstring 类型,你能很方便地连接两个字符串,正如下面的例子: 【程序编程相关:VC++中调用ADO的常用方法

cstring 对象的连接 【推荐阅读:VC中利用ADO共同实现数据库的操作

char gray[] = "gray"; char cat[] = "cat"; char * graycat = malloc(strlen(gray) + strlen(cat) + 1); strcpy(graycat, gray); strcat(graycat, cat);

2.字符串">格式化字符串  与其用 sprintf() 函数或 wsprintf() 函数来格式化一个字符串,还不如用 cstring 对象的format()方法: 【扩展信息:ADO+ 引导数据种类的演变

cstring gray("gray"); cstring cat("cat"); cstring graycat = gray + cat;

要比用下面的方法好得多:

cstring s; s.format(_t("the total is %d"), total);

  用这种方法的好处是你不用担心用来存放格式化后数据的缓冲区是否足够大,这些工作由cstring类替你完成.  格式化是一种把其它不是字符串类型的数据转化为cstring类型的最常用技巧,比如,把一个整数转化成cstring类型,可用如下方法:

cstring s; s.format(_t("%d"), total);

  我总是对我的字符串使用_t()宏,这是为了让我的代码至少有unicode的意识,当然,关于unicode的话题不在这篇文章的讨论范围._t()宏在8位字符环境下是如下定义的:

#define _t(x) x // 非unicode版本(non-unicode version)

而在unicode环境下是如下定义的:

#define _t(x) l##x // unicode版本(unicode version)

所以在unicode环境下,它的效果就相当于:

s.format(l"%d", total);

  如果你认为你的程序可能在unicode的环境下运行,那么开始在意用 unicode 编码.比如说,不要用 sizeof() 操作符来获得字符串的长度,因为在unicode环境下就会有2倍的误差.我们可以用一些方法来隐藏unicode的一些细节,比如在我需要获得字符长度的时候,我会用一个叫做dim的宏,这个宏是在我的dim.h文件中定义的,我会在我写的所有程序中都包含这个文件:

#define dim(x) ( sizeof((x)) / sizeof((x)[0]) )  这个宏不仅可以用来解决unicode的字符串长度的问题,也可以用在编译时定义的表格上,它可以获得表格的项数,如下:class whatever { ... }; whatever data[] = { { ... }, ... { ... }, }; for(int i = 0; i < dim(data); i++) // 扫描表格寻找匹配项.   这里要提醒你的就是一定要注意那些在参数中需要真实字节数的api函数调用,如果你传递字符个数给它,它将不能正常工作.如下:tchar data[20]; lstrcpyn(data, longstring, sizeof(data) - 1); // wrong! lstrcpyn(data, longstring, dim(data) - 1); // right writefile(f, data, dim(data), &byteswritten, null); // wrong! writefile(f, data, sizeof(data), &byteswritten, null); // right

造成以上原因是因为lstrcpyn需要一个字符个数作为参数,但是writefile却需要字节数作为参数.同样需要注意的是有时候需要写出数据的所有内容.如果你仅仅只想写出数据的真实长度,你可能会认为你应该这样做:

writefile(f, data, lstrlen(data), &byteswritten, null); // wrong

但是在unicode环境下,它不会正常工作.正确的做法应该是这样:

writefile(f, data, lstrlen(data) * sizeof(tchar), &byteswritten, null); // right

  因为writefile需要的是一个以字节为单位的长度.(可能有些人会想“在非unicode的环境下运行这行代码,就意味着总是在做一个多余的乘1操作,这样不会降低程序的效率吗?”这种想法是多余的,你必须要了解编译器实际上做了什么,没有哪一个c或c++编译器会把这种无聊的乘1操作留在代码中.在unicode环境下运行的时候,你也不必担心那个乘2操作会降低程序的效率,记住,这只是一个左移一位的操作而已,编译器也很乐意为你做这种替换.)  使用_t宏并不是意味着你已经创建了一个unicode的程序,你只是创建了一个有unicode意识的程序而已.
...   下一页

    摘要:  在vc环境下,mfc console程序默认行为是单线程工作环境。我们在“工程->设置->c\c++”下的code generation选项中,将use run-time library设为multithreaded(多线程)。也可以在当前当前的project options 中加入“/mt”。(表示使用多线程版本的c runtime函数库) #include #include ......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE