The ASCII (American Standard Code for Information Interchange) system was one of the first codings used to represent written human text on computers. It first started with teletype terminals, to allow the roman alphabet (used for English and European languages) to be inputted and outputted by computers.
Internally, computers do not have any concept for "text" or writing; they only represent things in binary digits or groups of binary digits. So the ASCII code defined 128 codes (originally), using 7-bits. Each of the 128 codes was asigned to a different letter, number, punctuation, or "operation", for example the letter "A" was decimal 65 (or binary 1000001) and the symbol for a blank "space" was decimal 32 (or binary 0100000). Since the code was needed to operate teletype terminals (automated typewriters), it also had non-printing (invisible) codes, including "backspace" which litterally backspaced the typewriter carraige, another for "carraige return", another for "line feed" (advanced the paper one line), one for a "bell" (which actually rang a bell in the teletype), and many others.
Soon after, and as computer memories and processing capacities expanded, the code was made into an 8-bit code having the ability to encode 256 unique symbols/characters. The primary difference was in the addition of letters with diacritical marks and many special "graphical" symbols. Over the years, the ASCII code became non-standard as different computer manufacturers assigned different "graphical" symbols to many of the upper codes.
So, yes the ASCII code did have too few printing characters. It could only encode the basic roman alphabet - it could not encode most diacritical marks (e.g. tilda, umlaut, etc.) needed for international writing. It also did not encode common symbols such as the british pound (currency) symbol, Euro (currency), or other written scripts/languages.
As far as having too few control codes, it had sufficient ones to meet the needs of the time. It actually had extra "reserved" (unused) codes, so it could have added additional control codes if necessary. However today, control codes are rarely used as part of text transmissons (other than carraige-return and line-feed, and maybe one or two others). The purpose of control codes are no longer encoded within text, and are part of software control mechanisms.
Regarding Unicode making improvements on the ASCII system, it does improve on the derth of characters. Unicode includes the entire 7-bit ASCII code as part of its first 128 codes. Unicode does not contain additional control codes (other then the original ones from ASCII), so if you feel ASCII had too few then Unicode will be the same. Unicode is a multi-byte character set that is recognized worldwide to include most of the world's major languages and scripts. However, Unicode is also not a universal standard. The UTF-8 standard - which incorporates Unicode within it - is becoming the single worldwide character-encoding standard.