我这个程序哪里出问题了?
虽然不想这么说但是....你的程序真的好多错误。
第一,变量c,e的类型搞错。
如果你仔细分析头文件stdio.h的话你就会发现getchar的定义是这样的
int getchar(void);
为啥是int??因为我们每一个字符内部表示就是一个整数。以下表达式是没有错误的
printf("%c: %d", 'a'+1, 'a'+1);
绝大多数字符都是正整数,万一我想编写一个程序,可能接受任意一种可表示字符。我如何输入一个特殊的不可显示的字符让程序停止呢?
绝大数控制台程序都有一个公认约定。当用户要强制退出可以按EOF(文件末尾标识符,键盘上为Ctrl+C)来停止。EOF是不可显示的,定义如下
#define EOF (-1)
一些特殊的字符的内部表示是负数----这就是为什么是int的原因.
<! ------ 分隔符 -------->
第二,scanf函数与输入流。
先做一个实验,用getchar来完成。
运行它,随便打几个字,可以看出即使getchar的定义是“从输入中读一个字符”,我们还是可以输入多个字符。
实际上为了频繁的读入写出操作次数,绝大多数输入函数都是有缓冲的,这意味着操作系统会分配一个缓冲空间来暂时存放字符。绝大多数时候,按回车后才会将缓冲区释放。
这一点可以在下面这个小程序看出。
输入“liu”,按回车,可以看到第11行的语句不会导致输入堵塞,并输出“l"与"i“之后程序结束
原因上面已经说了,第11行语句的getchar检测到缓冲区仍然有字符,所以直接在缓冲区读取而不会等待用户输入。
同理可得,scanf函数也只会读取自己”想要“的数据,剩下的字符将会保留到缓冲区。
例如对于语句scanf("%d", &num);输入"520 fuck"。
scanf将只读取"520",剩下的"fuck"将会被保留到输入缓冲区里。
所以综上所述: 直接跳过getchar函数的原因是缓冲区仍有字符。
<!-----------------------------分隔符--------------------------------->
解决方案:
参见: 我的另外一篇回答
2023-05-10 广告