首页 > 代码库 > 一个回车符引发的问题思考

一个回车符引发的问题思考

        在维护和开发通信类软件产品的过程中,经常需要处理一些软件故障问题。在问题刚出现的时候,大家可能显得手足无措,有一种天都要塌下来的感觉。但在问题原因找到之后,大家又会觉得问题原因非常的简单,要是当初开发的时候仔细一点,是不会犯这样的低级错误的。最近,本人就遇到了一个回车符引发的问题。

       近日,在开发某软件版本时需要对文件进行操作,在代码中使用了Linux C语言中的opendir函数,但是该函数始终返回NULL,提示文件路径不存在。

       本人查了一下该函数的具体情况。opendir函数的原型为:

       DIR* opendir (const char * path );

       功能为:

       成功时打开一个目录,在失败的时候返回一个空的指针。

       既然在版本中始终返回NULL,那就表示opendir函数执行失败了。

 

       遇到这个问题,本人觉得很诡异。因为在使用这个函数编写代码之前,先写了测试程序来验证该函数的功能,验证结果都是正常的。此外,测试程序和版本中的程序使用的就是同一个目录,该目录也具有777的权限。

        到底是什么原因呢?问题长期没解决就容易引起慌乱,想要尝试不同的解决办法。此时,本人怀疑可能是开发平台对函数做了限制,于是便在各种平台版本上移植,但是最终得到的结果都是相同的。

       在挣扎了很长时间之后,该问题依然存在。无奈之下,只好求助同事。但是,同事开始也是使用相同的方式,即检查目录是否存在、函数是否包含了头文件等,但所有的努力都是徒劳的。

       最后,实在是没有办法了,我直接将目录在代码中写死(即固定某个值)来测试(以前的目录是多个变量拼接而成的,现在就直接将最终的目录存放到变量szSrcDir)。测试居然成功了,真的是不可思议!此时,再仔细看了一下代码,顿时无语了。

      snprintf(szSrcDir, sizeof(szSrcDir)-1,"%s/%d/%d/%d/\n",

             ……,

             ……,

             ……,

             ……);

        原来,在组装的路径后面多了一个\n,才导致了之后的一系列结果。这也难怪,不管移植到哪里,只要用这条语句,结果肯定是的相同,都是回车符(\n)惹的祸。这真是让人哭笑不得,一切都是自己编码时不细致所致。

        修改代码,将\n去掉,测试通过。

        snprintf(szSrcDir, sizeof(szSrcDir)-1,"%s/%d/%d/%d/",

             ……,

             ……,

             ……,

             ……);

 

        问题原因是找到了,但我们要学会吃一堑,长一智。以后如何避免类似的问题出现呢?除了在编码是要极其专心之外,这还需要掌握一些基本的排错方法和长期的经验积累。在自己掌握的方法都无法定位问题时,就只能靠经验;若自己经验不足,那就需要请教相关同事,千万不可一个人埋头在那里苦思冥想。当自己陷入一种误区之后,就很难从中走出来,需要借助他人的力量才行。我们是工作在一个团队之中,大家始终要记住这句话。

       对于软件开发人员的细心,我想多说几句:

       (1) 在阅读他人代码的过程中,我经常看到有单词或文字写错的现象。如将“flag”写成了“falg”,将“phone”写成了“pone”,将“账户”写成了“帐户”等。这虽然不影响程序的执行,但也从侧面反映了一个开发人员的素养。当客户看到你的代码中有错误的单词或文字时,他可能会想你写的程序是否也会有问题。在写完代码之后,我们要多检查几遍,一般都可以规避这类问题。文档也是一样,在编写完文档之后,最好用语法检查工具来检查一遍。

       (2) 我们每天都要处理很多邮件,在阅读邮件的时候,经常看到有错别字、标点符号误用等现象。这虽然也不是什么严重的问题,但当别人看到你邮件中错别字连篇的时候,对你的印象就差了。有时,一个错别字就可能导致别人的错误理解,会产生什么样的后果大家都不知道。因此,作为开发人员,我们同样要学好语文,要严格要求自己。

 

      “小心驶得万年船”,对于软件产品来说,更是如此。在编写代码和文档的过程中,我们一定要杜绝一些低级错误,让自己的精力能够集中在最有创造力的事情上。

 

 

(本人微博:http://weibo.com/zhouzxi?topnav=1&wvr=5,微信号:245924426,欢迎关注!)