I agree with the parent (@HornWumpus -- good name), but I'd like to elaborate.
First, I agree that "There have always been a subset of CS students that didn't get anywhere close to the metal. They suck.", and I agree that "C isn't good enough." No language is good enough by itself. If you haven't played with Functional, Procedural, Object-Oriented, and hardware-level (Assembler) languages by the time you've graduated, you've missed something.
You can figure it out no matter what they teach you, you just have to be inquisitive and ask good questions. You should take compiler, operating systems, and a numeric computing class which will each teach you about overflow and precision and memory allocation, in different ways, regardless of programming language used. You should have a basic understanding of how to do everything from scratch, with bare hardware, short of soldering the chip to a board (unless that's your thing, then go learn that too).
But then you should also learn that many "higher" languages make this easier... they have garbage collection built-in and you should learn why and when that's a good thing and why and when it's a bad thing. Java is good for some things, bad for others. If you go through a CS degree and all that you come out with is knowing one language, get your money back. Ask "why" early and often.
You should learn concepts and hands-on. You should learn the ideas so that, when a new language comes up next year, you can understand the literature about the pros and cons. But you should also be able to sit down with a couple of languages and pound out some simple algorithms and I/O with no references.
I liked my CS degree, but there were things missing. I had to learn network programming (TCP/IP, etc.) on my own. We didn't do embedded systems, so I didn't have much experience with small hardware and the nuances that come with them. But the advice I'd give is to avoid too many classes that are "just" programming, and focus on the fundamentals. Use as many languages as possible. Take Artificial Intelligence, Compiler design, Operating systems, data structures, numerical computing. Take a comparative languages class if one is offered. Take a database class. And take these all realizing that they're teaching you exactly the same thing -- how to solve problems using computers.
It's all ones and zeroes in the end. Once you've mastered pushing them around for one thing, you should be able to push them around for another, it just takes practice. Practice as many things as possible.