导航
  • 主页
  • VC综合技术
  • MFC新技术
  • 互联网技术
  • .NET 技术
  • VC/MFC界面
  • VC/MFC 进程
  • VC/MFC 数据库
  • VC++技术资源

这两个程序哪个写的好,请大家发表意见。

zeliangzhang19801124 2010-07-04 07:26:23
1.半角转换为全角

CString CTestExcelChange091230Dlg::DbcToSbc(CString stringText)
{
CString str=L"";

int nLength=stringText.GetLength();
ASSERT(nLength!=0);
TCHAR *c=new TCHAR[sizeof(TCHAR)*nLength+1];
memset(c,0,sizeof(TCHAR)*nLength+1);
wcscpy(c,stringText);
for (int i=0;i<nLength;i++)
{
if (c[i]==32)
{
c[i]=(TCHAR)12288;
continue;
}
if (c[i]<127)
{
c[i]=(TCHAR)(c[i]+65248);
}

}

str.Format(L"%s",c);

delete c;
c=NULL;
return str;
}


2.这段程序今天看来有许多不好的地方,现将第一个程序其改为如下:

void CTestDlg2008Dlg::DbcToSbc(const CString stringText,CString &str)
{
int nLength=stringText.GetLength();
ASSERT(nLength!=0);
TCHAR *c=new TCHAR[sizeof(TCHAR)*nLength+1];
memset(c,0,sizeof(TCHAR)*nLength+1);
wcscpy(c,stringText);
for (int i=0;i<nLength;i++)
{
if (c[i]==32)
{
c[i]=(TCHAR)12288;
continue;
}
if (c[i]<127)
{
c[i]=(TCHAR)(c[i]+65248);
}

}

str.Format(L"%s",c);

delete []c;
c=NULL;
}
2010.7.3
...全文
266 点赞 收藏 28
写回复
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_heilongjiang 2010-07-12
-_-
回复
cdsnpeter 2010-07-12
编码风格不是很好,你的代码命名还能改进。
回复
jackson35296 2010-07-11
两段程序都有问题
TCHAR *c=new TCHAR[sizeof(TCHAR)*nLength+1];
memset(c,0,sizeof(TCHAR)*nLength+1);
c分配的空间太多了,造成浪费。new TCHAR[nLength+1];就行了,你那样写,如果是unicode的话,c分配的大小是2*(2*len+1)而你只需要2*len+2就够了。new的单元大小会考虑TCHAR的大小的,你这样是浪费内存。而且你的memset也只是对2*len+1清0,这个也是错误的,应该是memset(c,0,sizeof(TCHAR)*(nLength+1));应该是对2*len+2清0。因为unicode的0是以两个\0结尾。你这样写如何遇到字符串长度刚好是nLength的时候就暴露了bug。
回复
BoYueJiang 2010-07-11
不用讨论吧,
首先你的编码风格应该控制控制,

其次,如果你非要用第二种,可以试着让他有返回值类型,返回BOOL之类的。另
外,你还发现了吗? 你的new 出来的c 没有做NULL检查,纵使这个机率很小,但依然会存在。
还有就是楼上几位说的,直接使用了幻数。 哪怕你#define一下也会好很多。

还有像这种以WINDOWS界面无关的函数,你最好能够不要依赖WINDOWS平台的东西。 最好的方法就是先在控制台下测试,测试的时候,不要包含WINDOWS。H等头文件!
回复
大家都来讨论啊。
自己顶一下。
回复
两段代码都有Bug,转换方式差不多.没有看出有什么改进.
回复
俺习惯查字典方法。
回复
23楼说的好
回复
jogger007 2010-07-10
虚心学习来的
回复
ssy0691 2010-07-10
刚来看不懂
回复
受益匪浅,大家继续讨论
回复
sweetygirl 2010-07-10
不可能
回复
hahaking119 2010-07-10
看不懂怎么转的
回复
c271525290 2010-07-10
[Quote=引用 14 楼 r3000 的回复:]
都不好,应该按标准C++写,这样可以更容易移植。
TestExcelChange091230Dlg 、CTestDlg2008Dlg 这种命名方式很不好。
不符合开发规范。
if (c[i]==32)
{
c[i]=(TCHAR)12288;
continue;
}
if (c[i]<127)
{
c[i]=(TCHAR)(c[i]+65248……
[/Quote]
虽然我只是个菜鸟,但是我也觉得应该要按照标准C++来写……
回复
康斯坦汀 2010-07-08
都不好,应该按标准C++写,这样可以更容易移植。
TestExcelChange091230Dlg 、CTestDlg2008Dlg 这种命名方式很不好。
不符合开发规范。
if (c[i]==32)
{
c[i]=(TCHAR)12288;
continue;
}
if (c[i]<127)
{
c[i]=(TCHAR)(c[i]+65248);
}

直接在程序中使用具体数值,叫幻数吧,也是很不好的设计风格。
回复
zdcju 2010-07-08
看半天才发现,原来就这么点不同啊。。。。。。
貌似上面说的 第一个比第二个要多做一次深拷贝 外应该没什么影响
还有用应该都用 delete [] 才对
回复
顶一下。
回复
buyong 2010-07-07
delete 对于内部的数据类型 例如 int float double 等的动态数组p delet p和delete[]p是等价的 对于非内部数据类型的动态数组objects 而言 delete objects 和delete []objects是不一样的
如果 Obj *objects=new Objects[100] 用delete objects相当于delete objects[0],漏掉了 另外99个对象
回复
buyong 2010-07-07
delete 对于内部的数据类型 例如 int float double 等的动态数组p delet p和delete[]p是等价的 对于非内部数据类型的动态数组objects 而言 delete objects 和delete []objects是不一样的
如果 Obj *objects=new Objects[100] 用delete objects相当于delete objects[0],漏掉了 另外99个对象
回复
lazy_2010 2010-07-07
首先,可以看出是 vs2008;

其次,可以看出 TCHAR 实际对应 wchar_t;

第三,不如定义一个映射表 (ASCII, MBCS),使用查找表格的方式更合理;比如 ! @ 这样的符号不是直接加一个整数能映射的;
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……