I've tried a couple of times to teach myself to program in C using books, but haven't had the patience to progress through all the mundane examples. I have experience of programming in Java, and I'm a good PHP developer, so I find Hello World and generic programs-to-read-from-STDIN aren't really very informative.
I imagine that a better way to learn C might be the hands-on approach - choose an open source project and dig through the source code; have a stab at fixing a bug (even if you're not confident enough to submit the patch back to the maintainer). Many projects out there seem too complex to use as a learning environment though, or use large libraries that muddy the waters when trying to learn how the program works.
What open source projects are good places for novice C developers to learn the language?
Can anyone suggest a better approach to learning C (and explain why it's better)? If you think that reading a book and trying examples is the best approach, why do you think so? Writing your own code is obviously a good way to learn, but only once you've enough knowledge to tackle non-trivial problems, so how do you reach that point?
Learning a new programming language should be fun, not a hard slog through boring examples, so what approach would/did you take to stay interested when learning C-specific ways to do something you've done countless times before in other languages?