Many of the textbooks on the C programming language tell that C is a high-level programming language, but many of the tutors online say that C is also a middle-level programming language. Why is it like that?
Historically, everything that abstracts over assembly code was called high-level. C certainly does that. This definition is also relatively clear-cut, in contrast to what follows.
Over time, we created more and more programming languages and invented more and more abstractions and tools. Compared to, say, Python, the C language is positively primitive in semantic richness and level of abstraction over the hardware. With that in mind, many people find it misleading to call C high-level, when there is a wealth of languages that are far higher above the hardware.
So now "high-level" usually means "abstracts a lot over hardware" and "low-level" means "abstracts little". This is the definition your tutors use. Not everyone agrees though, and old texts don't magically adopt the new terminology, so you still see the old use of "high-level" (under which C is high-level) floating around. Keep in mind that many good C books are basically newer editions of books released twenty years ago.
It is a higher level language than machine code (assembly), which is the point of view that C programming books and tutorials come from.
In that respect it is a high level programming language.
However, it is still very close to the hardware - much more so than other, more modern languages (Java, C# and such) - when viewed from this point of view, it is a middle level programming language.