变量指定数组长度的语法叫做VLA,但是绝大多数工程师都会告诉你,避免使用VLA。这是因为VLA的实际实现没有规范背书,没有安全性、健壮性、稳定性、可移植性,行为也不可能做到完善的预测(一个动态分配空间的操作,是必然有可能出错的,但就我所知VLA没有任何标准的错误处理逻辑),一旦出了问题,调试和解决都会非常困难。总之,用VLA绝对是个坏习惯。(顺带一提,我用我的MSVC编译你的代码,报了编译错误。这进一步说明,微软那里的一些工程师们同样不认为VLA是什么值得使用的东西。)如果必须要根据输入决定长度,请使用STL容器,或者自己封装一个类也行,用malloc也行。这些方案都比VLA更加安全,尽管代码量稍微多一些。
此外,你这个代码风格实在是太糟糕了,这么不规范的代码,面试官很可能把你直接pass掉。编辑器一般有tab转空格功能,善用tab而不要狂按空格(在Makefile中不要把tab变成空格)。
==============================================
回到正题。已经输入一定数据仍能继续输入,需要换行才能继续输入,是非常正常的现象。这是因为控制台默认是行缓冲(line buffered),读取时是一行一行读取的,你不按回车,进程是无法获取控制台输入的值的。这点可以改变,但是非常麻烦,涉及操作系统API,而且这些方案通常没有可移植性。如果一定要进程实时从键盘获取任何东西,就不能使用scanf、fread这类C库函数,而要使用操作系统的键盘API,或者你也可以把控制台设置到raw模式(一般的模式是canonical模式,区别在于这个模式是行缓冲,识别SIGINT,raw模式可以是无缓冲),然后用操作系统底层API来从stdin获取数据。这个过程涉及大量资料查阅,而且Windows和Linux的API完全不同,不能通用。就我所知,要实现控制台实时读入,没有更简单的方法。
我的建议:接受这种行缓冲现象就好,这是正常的现象。而且,行缓冲一般会比无缓冲快一点,就你的需求而言,也完全没有必要给控制台实现无缓冲。