C语言中gets(char*);可以从标准输入中读入一行字符,存入字符串;而用fgets(char*,int,FILE*)可以从文件读入一行字符,其中的整型参数指的是缓冲区大小。
我之前以为get(s)和fgets(s,length,stdin)在不考虑溢出的问题时,行为是完全相同的,但是今天发现它们有个细微的差别。
宇宙的本质是计算
C语言中gets(char*);可以从标准输入中读入一行字符,存入字符串;而用fgets(char*,int,FILE*)可以从文件读入一行字符,其中的整型参数指的是缓冲区大小。
我之前以为get(s)和fgets(s,length,stdin)在不考虑溢出的问题时,行为是完全相同的,但是今天发现它们有个细微的差别。
整数在计算机中是以二进制形式存储的,整数的运算归根到底是二进制位的逻辑运算。
那么如何用最基本的位运算来实现整数的四则运算?
我今天写了“加”、“减”、“乘”、“除”、“取余”和“取相反数”这几种基本运算,代码中只用到了位运算。
我选择的是short型数值,并用代码循环了所有可能的情况(两个操作数分别从-32768到32767),可以验证我的运算函数的结果和直接做运算的结果是完全相同的(包括溢出的情况)。这些函数经过简单修改很容易支持更多位的整数。
有符号整数右移操作会复制符号位,我把一些函数的参数设置成了unsigned类型的,但是调用函数的时候可以直接传进有符号数。“加”、“减”、“乘”函数传进无符号数也可以得到正确结果。
由于有符号数中负数比正数多一个-32768,所以为了让程序支持边界条件,除法运算中所有操作都是针对负数进行的。
下面附代码:
ANSI C语言标准向scanf函数增加了一种新特性,叫做扫描集。利用此特性可以解决一些处理文本时的棘手问题。
最开始源于我对CSV(逗号分隔值)文件的处理。(本文不考虑CSV文件中引号和转义字符等其他特性)
例如下面这段代码
char a[100],b[100]; scanf("%s,%s",a,b);
如果用它读入下面的数据:
Alice,Bob
会直接把“Alice,Bob”赋值给a而继续等待输入b。
我在网上查了这种问题的解决方法,较为简便的一种就是利用扫描集。
我对C语言中各种数据类型的四则运算速度进行了测试。
操作系统:Windows 8.1 专业版 (64位)
编译器:GCC 4.8.1 64-bit Release (未开任何优化)
处理器:Intel Core i7-4702MQ
测试数据选择的都是12345和123
测试源程序:
今天尝试用代码生成了一张大小为1024*1024,每个像素的RGB值都是随机数的图片(以下图片经过了一定程度的压缩):
本应该是完全随机的图案,但是在图片中却可以明显地看出许多竖线,这显然是伪随机数的周期性导致的。
今天发现了一个不错的网页游戏,名字叫CodeCombat。
在游戏中,你需要编写代码去控制人物完成一定的任务。刚开始的时候,游戏会引导你使用类似moveDown()这样的函数去移动,或者类似attack()这样的函数去攻击怪物。随着游戏的进行,你需要学会使用判断语句、循环语句来做更多的事情,也需要自己写代码获取距离、计算坐标。
从Windows 3.1到Windows 7,每个版本的Windows操作系统上都附带了扫雷游戏,扫雷游戏也因此流传很广。
前几天有同学问我如何用C#写扫雷程序,于是我仿照Windows的扫雷写了一个。
国际C语言混乱代码大赛(IOCCC, The International Obfuscated C Code Contest)是一项国际编程赛事,从1984年开始,每年举办一次(1997年、1999年、2002年、2003年和2006年例外)。目的是写出最有创意的最让人难以理解的C语言代码。
(以上内容引用自维基百科)
正因为C语言有预处理器和一些不常用的特性,所以可以写出复杂难懂的代码。历年的获奖作品可以在这里看到。
例如以下代码(运行结果是一首英文诗):
放假之前曾经遇到这样一个问题:
Windows操作系统下,用java写的图形界面程序,打包成jar后,双击可以直接运行。但是java写的控制台程序,打包成jar后,双击无任何反应。
我们知道在cmd中直接输入“java -jar test.jar”就可以运行这个jar文件,程序的运行结果直接输出到控制台。既然用命令行可以运行,那么为什么直接双击却不能运行?
昨天和74LS138学长聊天的时候,突然想到一个问题:
基于比较的排序算法中,有很多可以达到\(O\left( {n\log n} \right)\)的时间复杂度,但是能不能找到一种在时间复杂度意义上更快速的排序算法?
在网上查了一下,答案是不能,而且竟然可以很简单地证明出这个结论。