getchar()陷阱,随便一本C语言进阶书都会提到,它字面上是读char,但实际上是返回int,就是为了返回-1而设定的,因为在早期的ASCII码中,没有负数内码的字符(但现在汉字码全是负数),所以为了表示特殊的出错状态,必须设计一个不可能出现的码值作为返回,告诉调用者遇到特殊情况,所以设计了-1(但其实是任何负数都可以,只要不是正常字符就可以,故虽然多数编译器设计EOF为-1,但不是必然的,何况那不过是宏定义,随时可能被覆盖掉)。操作系统为了方便用户用键盘输入某些特殊控制码,就设置了一些特殊按键,比如在处理流设备时,遇到按键^Z则转码为-1之类,可见这很明显是可移植性极弱的设计,它是语言编译器(标准库函数)与操作系统之间的协定——但未必是你的程序必须要遵循的。根据现实问题,你完全可以告诉用户,键入'#'或'*'之类是结束标志。