有趣的项目学习C?

我有一些C的基础知识(还有一点C ++)。 我收到了K&R的副本,我想用它来帮助我深入挖掘语言。 什么是一个好主意,将涉及使用C的大部分function和标准库? 另外,我应该注意到C89和C99之间有什么重要的区别?

编辑:忘了提及,这应该是初学者主要是可行的。 我不是要求编程教程; 而是中等规模的东西。 我明白操作系统的东西是C的主要目的之一,但是这不是太复杂吗?

另外,阅读和回答问题总是一个好主意,但是我想要得到一些实际的做法,制定一个可以做的事情的程序。

实现一种编程语言。 这不一定非常困难 – 我做了一些不能命名的语言 – 但是这会迫使你学习C的许多重要部分。如果你不想写一个词法分析器和/或parsing器你可以使用lex / flex和yacc / bison,但是如果你打算这么做的话,你可能需要从一个稍小的项目开始。

用一些高级语言编写一些程序并重写。 如果您使用了很多Perl / Python / Ruby / Bash脚本,并且在运行时注意到了延迟时间,请使用C语言重新编写,并重点关注性能。

但是,我认为,如果你正在编写一个学习C的程序,最好重新发明。 用C语言编程就是制作和调整轮子,如果你只是通过使用为你抽象的图书馆学习C,那么你真的没有学习C.这可能会更快 – 当你工作的时候在C的一个真实项目中,千万不要重新发明轮子 – 但是如果你正在做这个学习,那么一定要学习轮子的工作方式。

在StackOverflow上阅读和回答C问题是学习语言细节的好方法。

我会build议通过这些工作: http : //projecteuler.net/ 。 当然有时候在C中这样做效率低下有助于了解蛮力需要多长时间。 然后试着想出一个更聪明的方式,真正看到C的美丽完成!

一个简单的语法语言的解释器。 当然不应该使用词法分析器/parsing器生成器来使其变得有趣。

硬件(embedded式微处理器系统)和操作系统内核代码?

build立一个象棋游戏。 这可能是相当微不足道的,甚至可以用简单的控制台来完成。 它让你实现一些逻辑,使用数据结构,使用指针等。存储分数,让你得到持久性的工作。

根据你想要走多深,也许厄运 ?

当我想学习一门新的语言时,我总是会想出一些我觉得有用的实用工具,并且写出来。 我发现编写一个将要使用的实际程序不仅仅是对概念的certificate。

例如,你可能会编写一个程序,从指定的目录开始,它将横向build立一个所有文件的列表,并对它们做一些事情。 就像给你简单列出大于指定大小的所有文件。 然后弄清楚如何添加filter,以便完成后可以使用它来清理目录。 它可能会寻找单词“备份”或包含tmp的文件。 不要忘记至less有一个函数传递一个指针指向一个指向它们的好感觉。

是的,我知道你可以做到这一点,但你也可以定制一些特定的东西。

在这种情况下,我最喜欢的程序是一个正则expression式匹配程序,它使用非常基本的语法,但是使用了很多语言的低级function(并且C是相当低级的语言,大部分都是这样) 。

做一些内核黑客攻击

sudo apt-get install git-core git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git linux-2.6 

我使用ubuntu,所以我做了apt-get,我也使用gentoo,那里的命令是# emerge dev-util/git

一个简单的数据库应用程序(联系人列表,电影,专辑等)也可能是一个好项目; 它将涉及文件I / O,交互式I / O,内存pipe理,合理的肉感数据结构等。

如何http://projecteuler.net/完成与C?; 这应该触发一些braincells 🙂

对于语言的差异,不要太多。 他们不是很多,但仍然。 (我写了2年,但仍然不知道是什么stadard,如果我不受信任的编译器,它需要几分钟的时间来修复代码)

可能发生的最令人沮丧的事情之一是通常在代码中间定义值,如for(int i; i <2; i ++); 循环被认为只有c ++规范。 那正是我所面对的问题。 在交叉编译中,你会发现其他的东西比标准差异更令人沮丧。

对于从C开始,我build议学习algorithm和操作系统或embedded式系统(在中低端embedded式系统中仍然是最常见的语言)

从微芯片,atmel或freescaleand获得一些硬件的安全,并检查他们的embedded式RTOS支持。

2006年的ICFP大赛问题令人难以置信。 实现虚拟机的第一部分是一个小问题,就是C仍然适合的东西。 但是,它不会教你很多标准库。

也许看到(&提高)bigfiles.c和使用man 3 fts(遍历文件层次结构):

http://codesnippets.joyent.com/posts/show/1888