The major challenge though is to find good code to read.
In my experience, reading and working with bad code has proven to be extremely valuable too. Until you realize why something is bad (e.g. extremely long methods), you won't appreciate "good code". So, I suggest picking a medium-sized open source project in a language of your choice and start contributing some bug patches. You will come across plenty of both good and ugly code.
I suggest picking a medium-sized open source project in a language of your choice
Thanks. What's the best way to find medium size (what is considered medium sized) open source project? I code mostly in python and have several repos on github/michellesun.
Use the language all day, every day. Usually this means being full-time employed in the language.
Read all you can about the language. Especially, "best practices" and idioms.
Join a users group to talk with others about the language and what they do with it.
Work with other people's code! There is no faster way to learn what not to do in a language than to have to clean up after someone did something awful.
Support the code you write - every bug becomes a tour of your worst decisions!
Study computer science and languages in general
Learn a very different language. A great compliment to C would be a functional language like Lisp. This will turn the way you think about your procedural language inside out.
Learn to use the frameworks and APIs available for that language.
Take the time to do your own experiments with the language. SICP is not applicable to C, but the attitude of learning a language by testing its limits is a very productive one.
Read the history of the language to learn why it was made the way it is.
Attend conferences to hear the language authors speak, or to hear what industry leaders are doing with the language.
In my experience, reading and working with bad code has proven to be extremely valuable too. Until you realize why something is bad (e.g. extremely long methods), you won't appreciate "good code". So, I suggest picking a medium-sized open source project in a language of your choice and start contributing some bug patches. You will come across plenty of both good and ugly code.