2007年3月10日星期六

sprintf等C用法在C++的转换的小记

  当我主张(在PC上)用C++的新用法替换C语言的旧式用法时,许多人问来一些奇怪的问题,这里收集了几个典型问题,探讨一下。

1、字符数组
  别用这个了,string更好,也标准。同寝室有个同学更喜欢CString,好吧,这个我也没意见,我一般用string,因为我总觉得CString是MFC的东西(其实不是),有恐惧心理。
  另一方面,string是一个模版类,如果需要宽字节(比如Windows程序),就要用wstring代替,关于这个问题我另外撰文说明好了。简单的说,如果要显示中文,应该使用国际化支持,例如:流.imbue(locale("chs"));
  不过上面这段代码只能在Windows底下用,在Linux下要受到字体配置文件的影响。
  
2、sprintf(),将printf的结果送入字符串,用于缓冲
  其实这个问题挺难解决的。
  首先sprinf有缓冲区溢出的危险,snprintf没有这个危险,但是只有C99容纳了这个函数,C++03似乎没这东西。
  [tc]的建议是用stringstream,这东西总的说来好用,就是太慢。而且大家也知道,stream基本上没有解决二进制直接访问的问题,所以对效率要求非常高的话还使用指针。
  好在哪里呢?比如你要把一个"13.2"的字符串转换成13.2的数字,那么可以这样:
  stringstream ss;float fnum;
  ss<<"13.2";ss>>fnum;

3、getch()
  读一个字符本来就不是什么难事。更何况现在一般用这个函数只为了显示一行“Press Any Key To Continue...”,如果只是这样的话,一句“system(pause");”真是又简便又清楚。缺点就是不好移植。

4、动态数组
  老生常谈了。STL里的容器肯定比你写得好!这里就再废话几句:
   数据规模小 选vector,使用之前记得reserve()
   数据规模大 选list
   随机存取 选vector
   用iterator遍历 差不多,用vector
   前、后部插入 首选deque、vector也快
   后部删除 deque、vector
   前部删除 deque、list
   中间插入 list、deque,我比较倾向list
   中间删除 vector、deque
   交换数据 vector
  当然还有别的。
  顺便,不要再问排序了,容器都有.sort()。

5 条评论:

Unknown 说...

怎么看都感觉你在误导小孩子,我们数据结构的老师反复的说排序算法你们一定要自己做几遍……
另外魔兽修改器的源码给我一份。

[tc]天驰 说...

哈哈,学算法的话那当然要写。用的时候就不必了。
------------------------------
另外源码发到longinus4的邮箱了。

[tc]天驰 说...

再顺便,map和set封装了二叉树,hash表有个hash_map,不过这个是非标准的。

Unknown 说...

你貌似没有给关键部分的代码,vc写的那部分。
不过我收到的时候实验已经成功了,包括修改指定的值和指定的代码(逻辑上的区分)。我还是不知道你是怎么得到魔兽选兵时候的代码地址的。
另外,你在某处跳到你注入的代码区,你是怎么确定那里原来是空的?暴力搜索?

[tc]天驰 说...

首先,我那个程序并没有用VC++写过任何代码。

其次,什么叫做“实验已经成功了”,什么实验?

“原来是空的?”,.exe文件有许多规律可循,你会发现我用的其实是.exe文件头的后面,有一段为了安全起见保留的空间。