To learn C as your first language, you need to learn two things at the same time:
For a first-time programmer, these things are inseparable. C may not be the simplest choice for a first programming language, but on the other hand once you have started to get to grips with programming in C, you will have a fair understanding of how computers really function.
While lots of C programmers are entirely self-taught, I recommend choosing learning methods which will provide you with quite a lot of structure and guidance. A course or a tuition can provide this, and some books also are suitable for guiding beginners.
I can’t suggest in-person courses that might be geographically convenient or accessible for you, but I can recommend a remote course: Havard’s CS50x remote-learning course.
Introducing concepts for new programmers at the same time as teaching the C language requires a book to strike a balance between accuracy and accessibility.
If a book focuses too much on accuracy then it can present too much confusing detail too early for a complete beginner to absorb it. If a book focuses too much on accessibility, it is possible for it to over-simplify important concepts enough that beginners start of with misunderstandings, wrong assumptions and gaps that some people find difficult to identify and fix later.
Unfortunately too many books go too far in one direction or another, and therefore the list of books I can recommend is quite short. That list is:
K. N. King’s C Programming: A Modern Approach is widely recommended as a good introduction to programming in C.
Robert C. Seacord’s Effective C is very careful to only teach correct ideas, without simplifying or “dumbing down”. If you can learn C from this book, you will come out of it with fewer misconceptions than might be the case with some other books. On the other hand, other books might provide a gentler learning curve (to illustrate, Effective C introduces the concept of Undefined Behaviour on page 10).
C: How to Program, by Paul Deitel and Harvey Deitel has for a long time been recommended as an introduction to programming in C.
Unfortunately I myself did not learn C from any of the above books. Instead I unfortunately chose an enormous doorstop of a book with a lot of pages in it, imagining that this would provide value-for-money.
Unfortunately this wasn’t the case; instead it turned out that the book had some quality issues (perhaps small surprise for a large book, some publishers force authors to rush the writing of large books). I also found that when I wanted to find out about something having a large book provides a larger information haystack in which to locate the needle of understanding.
The second C book I bought was the second edition of Kernighan & Ritchie. Since I already had some experience of programming, this worked well for me. It’s kust under 270 pages long, and I found it reassuring to know that the answers to my questions were in a relatively short book and that finding the answer was likely to easier with this than the 1000-ish page book I had started with.
You will probably need to learn primarily with a book or a course, but you might find these exercises useful for practice.
When learning C, beginners should probably read a lot more code than they write (and to be sure this reflects what professional programmers usually do). However, many teaching environments don’t feature a lot of reading code, and I don’t yet have a “recommended reading list” of good C code.
If you’re a beginner and try to learn C by consuming very task-focused content (often but not only video tutorials), you will often find that you spend a lot of time on learning activities without feeling that you have in fact made progress.
I think this is because as a beginner you need to learn a lot of concepts and you need to develop skills in troubleshooting problems in C programs, while tutorial-style content doesn’t often help you to learn those things.
Some people call the resulting situation “Tutorial Hell”. See What exactly is tutorial hell? for some opinions on the problem.