Where there is a dream ,there is hope

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  64 Posts :: 0 Stories :: 8 Comments :: 0 Trackbacks

常用链接

留言簿(1)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

#

最近看代码的时候发现不少do {} while(0)的用法,在网上找到了篇比较详细的文章:
原文链接:http://www.cnblogs.com/flying_bat/archive/2008/01/18/1044693.html

1. do...while(0)消除goto语句。
通常,如果在一个函数中开始要分配一些资源,然后在中途执行过程中如果遇到错误则退出函数,当然,退出前先释放资源,我们的代码可能是这样:

bool Execute()
{
   
// 分配资源
   int *= new int;
   
bool bOk(true);

   
// 执行并进行错误处理
   bOk = func1();
   
if(!bOk) 
   
{
      delete p;   
      p 
= NULL;
      
return false;
   }


   bOk 
= func2();
   
if(!bOk) 
   
{
      delete p;   
      p 
= NULL;
      
return false;
   }


   bOk 
= func3();
   
if(!bOk) 
   
{
      delete p;   
      p 
= NULL;
      
return false;
   }


   
// .

   
// 执行成功,释放资源并返回
    delete p;   
    p 
= NULL;
    
return true;
   
}

改用do {}while(0)结构后,是这样:
bool Execute()
{
   
// 分配资源
   int *= new int;

   
bool bOk(true);
   
do
   
{
      
// 执行并进行错误处理
      bOk = func1();
      
if(!bOk) break;

      bOk 
= func2();
      
if(!bOk) break;

      bOk 
= func3();
      
if(!bOk) break;

      
// .

   }
while(0);

    
// 释放资源
    delete p;   
    p 
= NULL;
    
return bOk;
   
}

2 宏定义中的do...while(0)
  如果你是C++程序员,我有理由相信你用过,或者接触过,至少听说过MFC, 在MFC的afx.h文件里面, 你会发现很多宏定义都是用了do...while(0)或do...while(false), 比如说:
#define AFXASSUME(cond)       do { bool __afx_condVal=!!(cond); ASSERT(__afx_condVal); __analysis_assume(__afx_condVal); } while(0)
粗看我们就会觉得很奇怪,既然循环里面只执行了一次,我要这个看似多余的do...while(0)有什么意义呢?
当然有!
为了看起来更清晰,这里用一个简单点的宏来演示:
#define SAFE_DELETE(p) do{ delete p; p = NULL} while(0)
假设这里去掉do...while(0),
#define SAFE_DELETE(p) delete p; p = NULL;
那么以下代码:
if(NULL != p) SAFE_DELETE(p)
else   ...do sth...

就有两个问题,
1) 因为if分支后有两个语句,else分支没有对应的if,编译失败
2) 假设没有else, SAFE_DELETE中的第二个语句无论if测试是否通过,会永远执行。
你可能发现,为了避免这两个问题,我不一定要用这个令人费解的do...while,  我直接用{}括起来就可以了
#define SAFE_DELETE(p) { delete p; p = NULL;}
的确,这样的话上面的问题是不存在了,但是我想对于C++程序员来讲,在每个语句后面加分号是一种约定俗成的习惯,这样的话,以下代码:
if(NULL != p) SAFE_DELETE(p);
else   ...do sth...

其else分支就无法通过编译了(原因同上),所以采用do...while(0)是做好的选择了。

也许你会说,我们代码的习惯是在每个判断后面加上{}, 就不会有这种问题了,也就不需要do...while了,如:
if(...)
{
}
else
{
}

诚然,这是一个好的,应该提倡的编程习惯,但一般这样的宏都是作为library的一部分出现的,而对于一个library的作者,他所要做的就是让其库具有通用性,强壮性,因此他不能有任何对库的使用者的假设,如其编码规范,技术水平等。 

posted @ 2010-11-24 09:46 IT菜鸟 阅读(294) | 评论 (0)编辑 收藏

1.c++ unsigned char
C#中的char是16bits的Unicode字符,而一般C++中的字符则是8位的,所以C++中的“unsigned   char”在C#中要么转换成char,要么使用Byte类型来代替,前者适用于存放字符型的unsigned   char,后者适用于整数型的unsigned   char。
2.
unsigned int    == nint32
unsigned short== nint16
posted @ 2010-11-24 09:38 IT菜鸟 阅读(406) | 评论 (0)编辑 收藏

先看一段宏
#ifdef HSCRIPTDEBUG_EXPORTS
    
#define HSCRIPTDEBUG_API __declspec(dllexport)
#else
    
#define HSCRIPTDEBUG_API __declspec(dllimport)
#endif
 class HSCRIPTDEBUG_API ScriptDebug
 
{
 
public:

   }
;
__declspec(dllexport)用于导出符号,也就是定义该函数的dll;
__declspec(dllimport)用于导入,也就是使用该函数。

因为这个头文件既要被定义该函数的dll包含,也要被使用该函数的程序包含,当被前者包含时我们希望使用__declspec(dllexport)定义函数,当被后者包含时我们希望使用dllimport。于是我们使用
#ifdef _EXPORTING
#define CLASS_DECLSPEC __declspec(dllexport)
#else
#define CLASS_DECLSPEC __declspec(dllimport)
#endif
这种技巧,在定义该函数的dll中,其编译选项定义了_EXPORTING而使用该函数的程序则没有定义。

__declspec(dllimpot)如果要是类中有静态变量的话,是必须有这个的。


posted @ 2010-11-17 15:38 IT菜鸟 阅读(292) | 评论 (0)编辑 收藏

原文地址:http://www.comicer.com/stronghorse/water/software/ZipRar.htm



一、目录表(TOC)与分卷(Volume)

抛开压缩算法不谈,我认为zip、rar在文件格式上最大的差异就在目录表(Table of Contents,TOC):zip有TOC,而rar没有。

TOC这个词其实是从出版界借用过来的,指的就是每一本书正文前面的“目录”,它的作用地球人都知道:如果想快速找到书中某一内容,可以先查TOC,然后按照TOC指明的页码直接翻即可。

在纸质书里TOC是印刷出来的一张表,而在电子文件里则是由结构化数据构成的一张表,它的目的同样是为了快速定位:如果想找文件中的某一内容,可以先查TOC,知道感兴趣的内容在文件的什么位置,直接跳过去就行了。最常见的运用就是avi、rm等多媒体文件:播放的时候经常有人在播放条上点来点去跳着看(即“随机访问”),如果没有TOC,在长达几百兆的文件里来回定位会慢死。

具体到zip文件里,TOC是放在文件尾部的一张表,里面列出了zip包中每一个文件的属性(文件名、长度等)和在zip包中的存放位置。如果需要随机访问zip包中的某一个文件,只需在TOC里找到这个文件的存放位置,直接跳过去即可。

而RAR文件里则没有TOC,在文件头之后所有文件按顺序连续存放。

这种差异造成的结果就是:随机访问时zip比rar快,而顺序访问时rar比zip快。

所谓随机访问,就是前面说过的随机访问压缩包中某个指定的文件。举一个简单的例子:一本反编译或下载到的网页电子书,有大量HTML、图像、css、js,然后打成压缩包。现在要求在不解包的情况下访问其中的页面:可以想象,打开每个HTML页面的时候,它所附带的图像、css、js等文件可能随机分布在整个压缩包里,如果没有TOC,查找每个文件的时候都要从头开始找,将会有多慢。 所以各位可以理解为什么jar包就是标准zip包,而我也只用zip格式保存反编译出来的电子书、漫画、PDG书等一切可能需要随机访问的东西。

所谓顺序访问,就是将整个压缩包从头解到尾。在这方面RAR具有天然的优势。而且为了节省WinRAR列文件的时间,对于单个RAR我一般都直接通过右键菜单解压缩,很少双击压缩包打开再解压。解多个RAR时当然都用BatchUnRar。

由于rar的原作者已经去世,造成这种差异的确切原因我相信已不可考,但我个人猜测可能与DOS时代的备份软件之争有关:在DOS时代,电脑硬盘不像现在这样奢侈,20MB就算很大了。这样的容量用两盒软盘 即可备份,备份成本相对数据本身的价值来说非常低廉。因此在DOS时代,很多公司和机构都制定有定期硬盘备份政策,以免因为人为或非人为的因素 (早期硬盘可没有如今可靠)而造成不可挽回的数据损失。在备份软件方面,虽然微软已经随DOS提供了Backup/Restore工具,但是他们基本不具备数据压缩能力,因此在压缩软件中提供备份功能,就成为DOS时代的一个时尚。由于DOS时代的备份介质多为软盘,因此压缩 软件的备份功能其实就转化成如今很常见的一个功能:分卷压缩功能,即按照软盘容量进行分卷压缩,然后将分卷压缩文件备份(Backup)到软盘,需要的时候再解压,或恢复(Restore)到硬盘。

DOS时代最有名的zip工具是pkzip,出现得比DOS版的RAR早。在分卷压缩时,pkzip按照zip文件规范,将TOC存放在最后,即存储在最后一卷,由此带来如下问题:

1、恢复时,每解压一张盘,都要先将最后一张盘插进去一次,读一次TOC。
2、只要最后一张盘上的TOC坏了,就算其它盘都是好的,也不能正常解压。

这两个缺点,尤其是第一个缺点实在是太臭名昭著了,因此当时出现了非常强烈的改革呼声。在这个关键时刻,DOS版的RAR出现了:不仅压缩率比pkzip高(这点在DOS时代非常重要,毕竟软盘又贵容量又小),而且由于吸取了当时对zip格式的批评,取消了TOC,因此:

1、在恢复分卷压缩的备份文件时,不需要频繁插入带有TOC的分卷,按顺序换盘即可。
2、即使某个分卷损坏,也可以跳过,从完好的分卷再开始解压。

由于这些原因(当然还有其它原因),RAR推出后迅速取得了成功,pkzip在DOS时代就开始流失用户,到Windows时代基本消声匿迹。在Windows时代推出的Winzip,则彻底放弃了分卷压缩功能(zip格式永远的痛?)。 而从我看到的源自WinRAR的UnRAR源代码来看,现在WinRAR的解压思路明显还是把文件按顺序从头解到尾,看来当年备份/恢复工具之争的影响,还真是深远。

二、固实(solid)压缩方式

在压缩算法方面,我觉得rar格式最特色的是固实(solid)压缩方式。WinRAR v3.42的帮助文件中对固实压缩的说明如下:

固实压缩文件是 RAR 的一种特殊压缩方式存储的压缩文件,它把压缩文件中的全部文件都当成一个连续数据流来看待。

这段说明其实揭示了固实压缩格式能够提高压缩比的奥秘:数据压缩的基础是“重复”,例如aaaabbb这个字符串,里面就有重复,如果表示为a4b3,看起来是不是变短了?这就是“数据压缩”。“重复”是一个具有相对意义的概念,在某一范围内看起来没有重复,或重复不多的数据,把范围扩大,说不定就能找到更多重复的数据了,这就是固实压缩的奥秘。

举一个简单的例子:用zip和普通rar压缩一堆jpg文件,很难压下去,但是用固实压缩方式的rar就可以,其原因就在于:jpg文件本身已经是压缩格式了,单个jpg文件里很难再 找到可利用的重复数据,因此不论是用zip还是普通的rar都很难再压缩,因为他们都将需要压缩的文件分隔开来一个一个处理。但是对于固实rar来说,是将 所有需要压缩的jpg文件当作一个整体来压缩,这些jpg之间就存在重复的数据,如他们都有相同的文件头(其中包括各种数据表)等,这就出现了可压缩的空间。从我看到的资料来看,Flash文件也采用了类似的技术对jpg进行压缩:如果在Flash文件中使用了多个jpg文件,它们可以共用一个文件头。

当然天下不会有白吃的午餐,固实压缩方式在提高压缩比的同时,也有一些限制,在WinRAR v3.42帮助文件中的说法是:

固实压缩可增加压缩性能,特别是在添加大量的小文件的时候,但它也有一些重要的不利因素:

  • 对已存在的固实压缩文件更新时较慢;
  • 要从固实的压缩文件解压单个文件时,它之前的文件都需先经过分析。这造成当从固实的压缩文件内取出文件时会比一般压缩文件取出文件慢一些。但是,当从固实的压缩文件解压全部的文件时,解压速度并没有影响。
  • 如果在固实压缩文件中的任何文件损坏了,要从损坏的范围中解压全部的文件是不可能的。因此,如果固实压缩文件是保存在例如软盘等媒介时,推荐你在制作时使用“恢复记录”。

固实压缩的适用场合为:

  • 压缩文件很少更新的时候;
  • 不需要经常从压缩文件中解压一个文件或是部分文件的时候;
  • 压缩效率比压缩速度更为重要的时候。

与前面说的“随机访问”对应,固实压缩的RAR文件可能是世界上最不适合随机访问的:如果需要访问固实RAR包中的某个文件,就要从文件头开始解压,一直解到这个文件。

三、安全性

这里的安全性包含几个方面的含义:文件系统安全性、密码保护安全性和文件数据安全性。

由于制订zip格式规范的时候操作系统本身的文件安全性还没有引起足够的重视,因此zip格式只记录最基本的文件属性,包括只读属性等,没有其它附加的安全属性。

rar格式刚推出的时候,文件系统的安全性只能参照DOS,和zip差不多。但是rar毕竟是一种封闭的格式,想怎么改作者一个人说了就算,因此当Windows中出现NTFS,并且引入扩展的文件系统安全属性时,rar也积极跟进,所以现在应该说rar格式在这方面比zip强 。

在zip和rar格式中均提供了密码保护功能,但是密码保护的安全强度不同。

zip由于格式开放、代码开源,因此zip密码破解软件出现得比较早,也比较多。初期以暴力破解为主,威胁不大,真正对zip密码安全的致命一击是known plain text(已知明文)攻击法:如果知道加密zip文件中某段内容(密文,ciphertext)解密后的真正内容(明文,plain text),就可以反推出zip加密口令。在这种攻击方法的威胁,及某些国家的法律对密码技术的限制下, 著名开源组织zlib宣布永久放弃对加密zip的支持,详见zlib网站上的相关说明(不过在zlib发行的源代码里仔细找找,还是能找到原来的加/解密相关代码)。

记得rar刚推出的时候也和zip一样,虽然不能列出加密文件中的文件内容,但可以列出加密文件中的文件名。后来大概也是被known plain text攻击法吓到了,增加了一个“加密文件名”选项,干脆连加密rar文件里有哪些文件都看不见,让攻击者想猜明文都无从猜起。

rar格式比zip晚推出,在安全方面吸取了足够的教训,因此采用的是美国国家标准与技术局(National Institute of Standard and Technology, NIST)推荐的、目前公认安全程度比较高的AES对称加密算法 ,密钥长度128位。在ASE被攻破以前(NIST认为30年内无法攻破),大家都只能在暴力法上兜圈子,所以密码安全性应该说比zip高。对此WinRAR 3.42的帮助文件是这样描述的:

ZIP 格式使用私有加密算法。 RAR 压缩文件使用更强大的 AES-128 标准加密。如果你需要加密重要的信息,选择 RAR 压缩文件格式会比较好一些。为了确实的安全性,密码长度请最少要 8 个字符。不要使用任何语言的单词作为密码,最好是任意的随机组合字符和数字,并且要注意密码的大小写。请记住,如果你遗失你的密码,你将无法取出加密的文件,就算是 WinRAR 的作者本身也无法解压加密过的文件。

在数据安全性方面,RAR格式本身支持一种特殊的附加信息类型,叫做“恢复记录”。如果RAR文件有恢复记录,在介质物理损坏或其它原因造成数据丢失时,WinRAR可以按照“恢复记录”尝试对数据进行修复。而zip格式无恢复记录,因此在数据安全性方面应该说比RAR弱。

虽然RAR文件本身支持恢复记录,但是在WinRAR里此选项缺省是关闭的,而打开后会导致压缩出来的RAR文件体积增加(增加的百分比与设置有关),可能会令某些人感到不习惯(我就亲眼见到有人在论坛上抱怨为什么压出来的RAR文件会如此庞大),所以这个功能基本上形同虚设。

四、开放性

开放性的对比很明显:zip格式不仅文件格式完全公开,而且有专门的开源组织提供操作源代码,跨平台使用也没有多大限制;rar格式完全保密,作者只提供解压所需源代码,不提供压缩所需源代码 ,跨平台使用有点麻烦。

zip开源组织中,最出名的是zlibInfoZip,二者各有侧重:zlib偏重对内存缓冲区的压缩,因此被png等开源组织用做内部压缩算法,连java的jar程序内核都来自zlib,打出来的jar包自然也是一个标准的zip文件;InfoZip偏重对文件的操作 (包括口令保护),应用似乎不如zlib广泛,但我个人觉得其实它还是满好用的,前提是需要对它的源代码进行一些必要的修改。

png组织的网页中有说到png格式的来历,我觉得也很有意思:做png的一班人,其实原来都是做gif格式的,但是由于Unisys公司开始对gif格式的核心——LZW压缩算法征收专利费,这帮人怒了,干脆提出png格式:大结构方面还是采用分段结构,但是核心压缩算法采用开源的zlib,压缩 效果在多数情况下比gif的LZW更强。由于没有版权限制,在静态图形领域png得到广泛应用,如果不是及时提出动画支持并因此在web上大行其道,我估计gif早就死掉了。

RAR的解压源代码在其官方网站www.rarlab.com上提供,通常比WinRAR的正式版本晚一点,不过据说是直接从WinRAR的源代码中抠出来的,所以兼容性应该没有什么问题。

五、结论

以下观点纯属个人观点,仅供参考,不具有如何指导意义:

  • 如果经常需要对压缩包进行随机访问,应该选zip而不是rar。虽然将下载到的rar重新压缩成zip会麻烦一次,但是以后会减少无数的麻烦。
  • 如果需要分卷压缩(如某些网站对上传文件大小有限制),则只能用rar。事实上,这也是我唯一会使用rar格式的场合,其它时候一律zip没商量。
posted @ 2010-11-16 09:38 IT菜鸟 阅读(552) | 评论 (0)编辑 收藏

http://monodevelop.com/Developers/Articles/The_Command_System#Menus_and_Toolbars
命令系统
本文阐述了Monodevelop命令系统的工作机制以及开发者如何利用这些优势来写自己的插件。

1。基本概念
在阐述Monodevelop命令系统的工作机制之前,我们先要了解两件事
命令和使用这些命令的菜单和工具条是分开定义的
命令的执行是取决于上下文的,比如说你在文本编辑器中调用delete和在工程目录树中调用delete虽然都

是同一条命令,但是执行结果却是不一样的。
2。命令定义
命令都是要定义在"/MonoDevelop/Ide/Commands" 这个扩展点下面,如下:

<Command id = "MonoDevelop.Ide.Commands.ProjectCommands.Run"
    defaultHandler 
= "MonoDevelop.Ide.Commands.RunHandler"
    icon 
= "gtk-execute"
    shortcut 
= "F5"
    description 
= "Run"
    _label 
= "Run" />


id:命令的标识,注意:这个id一定要和已存在的枚举类型的全名(包括命名空间)保持一致。这个枚举

类型会被用来确定执行那个具体的命令。

defaultHandler:是用来标识执行当前上下文中默认的命令类

icon:在工具条和菜单栏中显示的图标

_lable: 在菜单栏上显示的文本

description:显示在tooltip上的文字(可选)

shortcut: 命令的快捷键

Toggle 命令
是用来在主文本旁边显示一个是否触发状态的命令,以及显示工具栏是否激活的标识。这些命令用check

来标识。如下:

<Command id = "MonoDevelop.Ide.Commands.ProjectCommands.IncludeInBuild"
  type 
= "check"
 _label 
= "Build" />

 

如果有多个toggle命令相互排斥,那么你可以用radio类型来标识。
Custom commands 自定义命令
自定义命令用来展示在菜单和工具栏上的自定义的小窗体。如果要使用它,先将type属性设置为custom然

后在widget标签中指定相应的小窗体类。如下:

<Command id = "MonoDevelop.Ide.Commands.ProjectCommands.ConfigurationSelector"
    type 
= "custom"
    widget 
= "MonoDevelop.Ide.Gui.ConfigurationComboBox"
    _label 
= "Active Configuration" />

 

Command Arrays 命令组
命令组是用来实现菜单栏中的选择列表。

<Command id = "MonoDevelop.Ide.Commands.WindowCommands.OpenWindowList"
    defaultHandler 
= "MonoDevelop.Ide.Commands.OpenWindowListHandler"
    type
="radio|array"
    _label 
= "Window List" />


注意:array和check可以同时使用,也可以和radio一起使用。一般来说,命令组用来动态的在菜单和工

具栏上产生命令。

<Command id = "MonoDevelop.Ide.Commands.FileCommands.RecentFileList"
     defaultHandler 
= "MonoDevelop.Ide.Commands.RecentFileListHandler"
     type
="array"
     _label 
= "Recent Files" />

 


3。菜单和工具条

Menus and Toolbars 菜单栏和工具条
菜单栏和工具条用相同的方式来定义。IDE提供了很多扩展点来定义主菜单,主工具条,如下:

CommandItem

Creates an item that will invoke the command identified by the id attribute. If the command

is actually a command array, it will create an item for each element in the command array.

SeparatorItem

ItemSet
创建一个item的字项菜单,它有两个属性_label和icon
用在工具栏上,那就是下拉式的

LinkItem
创建打开网络连接的入口
Creates a menu or toolbar entry that opens a web page in the default web browser. For

example:

 

<LinkItem id = "MonoDevelop" _label = "MonoDevelop" link = "http://www.monodevelop.com" />

 

4。执行命令

执行命令
牢记:命令的执行和命令的上下文息息相关
那什么是上下文呢?上下文就是拥有焦点的窗体,当焦点改变的时候,上下文也随之而变。命令集就跟着

变为可用或者不可用。
这意味这我们每一个窗体定义命令执行类了吗?非也,每个widget都有一个command dispathcroute.dang

当调用一个命令的时候,如果具有焦点的widget没有handler,那么它就会传递给route上的下一个对象,

也就是父widget
如下图所示:

通常,command routes会按照下面这个顺序来寻找:
*拥有焦点的widget
*父widget,直到root widget
*全局command Handler,使用这个来注册:Ide.CommandServices.RegisterGlobalHandler(object)
*default handler:就是配置文件中的defaulterHandler

Implementing command handlers实现

 

[CommandHandler (FileCommands.Save)]
protected void OnSaveFile ()
{
     
// Do the save
}

 

FileCommands.Save是用来标记命令的枚举值

Managing Command Status 更改命令状态
打开monodevelop,新建一个文件,发现delete是禁用的,输入一些字,发现它可用用了,点一些任务列

表,发现它又不可以用了。这是怎么做到的呢?
我们先要理解一件事:命令系统会自动禁用不是该command route上的命令.这是在焦点发生改变的时候发

生的。
如果命令的状态依附于应用内部的逻辑结构,可用将它加入到一个特殊的Command Update Handler。

 

[CommandUpdateHandler (FileCommands.Save)]
protected void OnUpdateSaveFile (CommandInfo info)
{
    IViewContent content 
= window.ActiveViewContent as IViewContent;
    info.Enabled 
= content.IsDirty;
}

 

这条命令会在命令系统想要知道命令的状态的时候调用。比如说菜单命令,当菜单要显示的时候就调用,

工具栏是周期性的调用。

因为命令更新和命令是一体的,所以更新的方法要和执行的方法在一起写。

在command update handler 中,你可以使用commandinfo对象来改变对象的状态。但并不限于此,你可以

改变command的所有属性,比如说描述文字,可见性等等。

Array command handlers

The default command handler

Startup Extension Path
这个特殊的commandhandler会在monodevelop启动的时候调用的,你需要做两件事。
首先,将你的class 比如说myhandler加入到启动的扩展点,修改MonoDevelop.Ide.addin.xml 文件像这

样:

<Extension path = "/MonoDevelop/Ide/StartupHandlers">
  
<Class class = "MyHandler"/>
</Extension>


接下来,完成这个类的实现

class MyHandler: CommandHandler
{
  
protected override void Run ()
  
{
    Console.Out.WriteLine(
"Hello World!");
  }
  
}

 

 

 

posted @ 2010-11-11 14:45 IT菜鸟 阅读(937) | 评论 (0)编辑 收藏

     摘要:      转来的一篇文章,没找到原作者-------------------       在担任公司高管的几年间,我面试过数以百计的各个层面的员工,其中最让我感到遗憾的一个现象就是很多人有着非常好的素质,甚至有的还是名校的毕业生,因为不懂得去规划自己的职业,在工作多年后,依然拿着微薄的薪水...  阅读全文
posted @ 2010-11-02 08:09 IT菜鸟 阅读(396) | 评论 (0)编辑 收藏

一getchar()

1.

1char c;
2while((c = getchar()) != EOF){
3    putchar(c);
4}

5

输入值:abc后面跟个回车
本以为屏幕应该显示
a
a
b
b
c
c

实际上是:
abc
abc

这是因为只有当输入回车时,系统才认为是输入完毕

2.上面的代码还有一个问题
因为EOF是-1,所以c=getchar()这一句会出现问题
所以c应该是int c

二、EOF

只有在新的一行输入的时候输入EOF才算是文件结束符
假设输入:
abc^zqwer
输出为:
abc

posted @ 2010-11-01 16:07 IT菜鸟 阅读(239) | 评论 (0)编辑 收藏

1.目录相关

.指当前目录 例:~$ ./qq就是启动当前目录下的QQ程序

..指上一级目录 例:~$ ../qq 就是启动上一级目录下的QQ程序

~指Home目录 例如:~$ cd~ 就是回到HOME目录
posted @ 2010-10-23 19:05 IT菜鸟 阅读(220) | 评论 (0)编辑 收藏

今天用UBUNTU自带的工具打开PDF,里面不能正常显示文字。刚一开始以为是乱码,仔细一观察原来是所有的中文没有显示,英文都是正常的。折腾了半天终于搞定。原因是没有安装相关中文支持。
解决方法如下:

1. sudo apt-get install xpdf-chinese-simplified
2. sudo apt-get install xpdf-chinese-traditional (可选该项)

如果还不能正确显示中文,可能缺少如下 所示工具包:

1. sudo apt-get install poppler-utils
2. sudo apt-get install poppler-data


本来经过上面两步,基本就会正常显示中文字体了,但是我的还是没有显示,不过有进步,以前是什么都没有,现在是一个个的小方块。GOOGLE后,终于找到了解决方案:修改配置文件。

执行命令:

sudo vi /etc/fonts/conf.d/49-sansserif.conf

打开后,找到这一行:

<edit name="family" mode="append_last"> 

将他下面的一行修改为:
<string>WenQuanYi Micro Hei</string>

WenQuanYi Micro Hei的意思就是:中文字体“文泉驿微米黑”。

再次打开PDF,终于可以正常显示了。哈哈。


posted @ 2010-10-23 15:09 IT菜鸟 阅读(966) | 评论 (0)编辑 收藏

1.GCC
UBUNTU自带GCC,但是GCC还不能编译文件,因为缺少一些头文件。这里我们安装build-essential这个软件包。安装了这个软件包会自动安装G
++,libc6-dev ,linux-libc-dev,libstdc6-4-1等一些必须的软件和头文件的库。
命令:
sudo apt-get install build-essential

2.VIM
一个强大的文本编辑器(据说。。我也没用过,大家都说好肯定有好的道理吧)
安装命令:
sudo apt-get intall vim

3.第一个ubuntu程序
用VIM写一个文本文件。
vim hello.c

这样就建立了一个hello.c的程序,并进入编辑模式。
输入以下代码:
#include <stdio.h>
int main(void)
{
   printf(
"Hello ,this is my first program in ubuntu");
   
return 0;
}

编辑完毕,输入:w保存文件。

编译此文件:
gcc -Wall hello.c -o hello

运行命令:
./hello
屏幕上就会打印出那一行文字了。



posted @ 2010-10-23 13:27 IT菜鸟 阅读(256) | 评论 (0)编辑 收藏

仅列出标题
共7页: 1 2 3 4 5 6 7