I started programming with Borland Turbo C 1.0 back in 1987. It came on one 3.5 inch floppy at the time. I didn't have a lot of money then, so I was pretty much restricted to the Borland manuals, but I had a hard time with them.
In the end, the way I really learned the language was by deciding that I wanted to do something with C, and beating my head against the wall, and the function reference alternately, until I got it done.
In retrospect the programming was terrible. No design, the whole program was in the main() function, every thing that I did was done the least efficient possible way, but the program worked, and was widely used within the National Space Society for several years.
Books can hurt you, too. I don't know how many times I have bought a book about the programming language and version that I have, but even the first example in the book won't compile, or doesn't work as expected. At that point it is natural to assume that you are the problem because the source code is in a published book, so it must be right. Not true, but I'm sure that a number of prospective programmers have given up on that career path because of poorly written books.
Lately, my gripe about books with example programs is that a lot of them seem to really focus in on graphics. Well, graphics will never be something that I spend a lot of time on, because I'm partially color blind.
So my advice is to develop your own test questions for yourself. Use books to learn the IDE and standards for the language. Keep a function reference with you at all times, and remember that programming is supposed to be enjoyable as well as useful.
Push your limits as hard as you can. If you see something that somene else has done, even in another language, and it looks pretty cool, try to duplicate it. It's a hard way to learn, and can be very frustrating, but you will remember your mistakes a lot longer than anything you read in a book.
It's even better to decide that you want to do something that no one else is doing. Maybe it has already been done, but you can't know that. I decided to write implementations of the Newton-Raphson method for causing rapid convergance of solutions of two equations with two unknowns. I enjoyed that. Then I wrote a program that calculates the filled volume of a horizontal cylinder, with hemispherical end caps, using the Riemann Sum method. That turned out to be a pretty useful program and both are available, free, at Planet Source Code. To make things more interesting, I did them in Visual Basic.
Recently, even though I have Mickeysoft Visual C++ 6.0, I downloaded the free version of Borland C++ 5.5. The one that doesn't come with an IDE. And I started a C++ refresher course. I even bought a few books. The problem is that there isn't anything I want to do that absolutely requires C++, so that project is progressing at a snail's pace.
To sum it up, it is hard to become a competent programmer if there isn't a program that you WANT to write.