我这个程序哪里出问题了?

为什么我有一个getchar的语句,可他却直接跳过了,重新进入for函数了,但是如果把变量e定义成int型,e的值改为一个数字,这个程序又是正确的... 为什么我有一个getchar的语句,可他却直接跳过了,重新进入for函数了,但是如果把变量e定义成int型,e的值改为一个数字,这个程序又是正确的 展开
 我来答
哲学化身
2020-05-08
知道答主
回答量:25
采纳率:100%
帮助的人:4.1万
展开全部

虽然不想这么说但是....你的程序真的好多错误。

第一,变量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函数的原因是缓冲区仍有字符。

<!-----------------------------分隔符--------------------------------->

解决方案:

参见: 我的另外一篇回答

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式