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

2024-12-26 09:41:28
推荐回答(1个)
回答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函数的原因是缓冲区仍有字符。

解决方案:

参见: 我的另外一篇回答