C语言中的gets()与fgets()

C语言中gets(char*);可以从标准输入中读入一行字符,存入字符串;而用fgets(char*,int,FILE*)可以从文件读入一行字符,其中的整型参数指的是缓冲区大小。

我之前以为get(s)和fgets(s,length,stdin)在不考虑溢出的问题时,行为是完全相同的,但是今天发现它们有个细微的差别。

继续阅读“C语言中的gets()与fgets()”

只用位运算来写整数四则运算程序

整数在计算机中是以二进制形式存储的,整数的运算归根到底是二进制位的逻辑运算。

那么如何用最基本的位运算来实现整数的四则运算?

我今天写了“加”、“减”、“乘”、“除”、“取余”和“取相反数”这几种基本运算,代码中只用到了位运算。

我选择的是short型数值,并用代码循环了所有可能的情况(两个操作数分别从-32768到32767),可以验证我的运算函数的结果和直接做运算的结果是完全相同的(包括溢出的情况)。这些函数经过简单修改很容易支持更多位的整数。

有符号整数右移操作会复制符号位,我把一些函数的参数设置成了unsigned类型的,但是调用函数的时候可以直接传进有符号数。“加”、“减”、“乘”函数传进无符号数也可以得到正确结果。

由于有符号数中负数比正数多一个-32768,所以为了让程序支持边界条件,除法运算中所有操作都是针对负数进行的。

下面附代码:

继续阅读“只用位运算来写整数四则运算程序”

scanf函数中的扫描集

ANSI C语言标准向scanf函数增加了一种新特性,叫做扫描集。利用此特性可以解决一些处理文本时的棘手问题。

最开始源于我对CSV(逗号分隔值)文件的处理。(本文不考虑CSV文件中引号和转义字符等其他特性)

例如下面这段代码

char a[100],b[100];
scanf("%s,%s",a,b);

如果用它读入下面的数据:

Alice,Bob

会直接把“Alice,Bob”赋值给a而继续等待输入b。

我在网上查了这种问题的解决方法,较为简便的一种就是利用扫描集。

继续阅读“scanf函数中的扫描集”

对C语言中不同类型数据计算速度的测试

我对C语言中各种数据类型的四则运算速度进行了测试。

操作系统:Windows 8.1 专业版 (64位)
编译器:GCC 4.8.1 64-bit Release (未开任何优化)
处理器:Intel Core i7-4702MQ

测试数据选择的都是12345和123

测试源程序:

继续阅读“对C语言中不同类型数据计算速度的测试”

从图片看出伪随机数的周期性

今天尝试用代码生成了一张大小为1024*1024,每个像素的RGB值都是随机数的图片(以下图片经过了一定程度的压缩):

random1

本应该是完全随机的图案,但是在图片中却可以明显地看出许多竖线,这显然是伪随机数的周期性导致的。

继续阅读“从图片看出伪随机数的周期性”

用编程来玩的游戏CodeCombat

今天发现了一个不错的网页游戏,名字叫CodeCombat。

在游戏中,你需要编写代码去控制人物完成一定的任务。刚开始的时候,游戏会引导你使用类似moveDown()这样的函数去移动,或者类似attack()这样的函数去攻击怪物。随着游戏的进行,你需要学会使用判断语句、循环语句来做更多的事情,也需要自己写代码获取距离、计算坐标。

继续阅读“用编程来玩的游戏CodeCombat”

C语言混乱代码

国际C语言混乱代码大赛(IOCCC, The International Obfuscated C Code Contest)是一项国际编程赛事,从1984年开始,每年举办一次(1997年、1999年、2002年、2003年和2006年例外)。目的是写出最有创意的最让人难以理解的C语言代码。

(以上内容引用自维基百科)

正因为C语言有预处理器和一些不常用的特性,所以可以写出复杂难懂的代码。历年的获奖作品可以在这里看到。

例如以下代码(运行结果是一首英文诗):

继续阅读“C语言混乱代码”

Windows下双击jar文件运行java控制台程序

放假之前曾经遇到这样一个问题:

Windows操作系统下,用java写的图形界面程序,打包成jar后,双击可以直接运行。但是java写的控制台程序,打包成jar后,双击无任何反应。

我们知道在cmd中直接输入“java -jar test.jar”就可以运行这个jar文件,程序的运行结果直接输出到控制台。既然用命令行可以运行,那么为什么直接双击却不能运行?

继续阅读“Windows下双击jar文件运行java控制台程序”

基于比较的排序算法时间复杂度下限

昨天和74LS138学长聊天的时候,突然想到一个问题:

基于比较的排序算法中,有很多可以达到\(O\left( {n\log n} \right)\)的时间复杂度,但是能不能找到一种在时间复杂度意义上更快速的排序算法?

在网上查了一下,答案是不能,而且竟然可以很简单地证明出这个结论。

继续阅读“基于比较的排序算法时间复杂度下限”