printf("%c", ch);
return 0;
}
可能大家会有疑问了,为什么我这里ch明明是用来存储getchar函数读取的字符变量,为什么要用int而不是char呢?我来解释一下,在这里有两点原因:**1.举个例子,我们想打印字符‘a’,字符‘a’在C语言中是以ASCII码值97来存储的,所以int在这里存储ASCII码值97,也可以起到打印‘a’的作用。2.当getchar读取失败,错误时,getchar会返回EOF,EOF就是整形数据 -1,我们知道整形数据占4个字节,而char字符数据占1个字节,如果我们使用char来定义ch,很显然,内存不够。综上考虑,所以我们使用int来定义ch。**
---
## putchar函数
putchar函数和printf函数相类似。用来向stdout(标准输出)打印字符数据。
**putchar函数的写法**
int main()
{
int ch = getchar();
putchar(ch);
return 0;
}
## 总结
*putchar和getchar函数只能用来操作字符,而且一次只能操作一个字符,与printf和scanf函数相比较有一些不足,所以我们在使用时要注意。*
---
## 关于getchar和putchar的几个代码实例
### 1

我们可以不停地输入字符,然后输出输入的字符。这个代码不会终止,我们可以使用ctrl+z来终止这个程序(返回EOF)。注:而且括号一定要记着加,否则当你输入一个字符后,它会不停地打印输入的字符。一定要注意运算符号优先级。
---
### 2

我们想设计一个简单的登录过程的程序。这样写代码如果不细看感觉是没有问题的。我们运行一下。会出现bug,当我们输入完密码后,程序直接出现确认失败。

我们不得不提到一个东西,那就是输入缓冲区。我们用键盘输入的字符并不能直接*被放到函数中(scanf ,putchar等等)*,而是*先被放到了缓冲区中*,之后函数再从缓冲区中一个一个地取出字符。而在上面的程序中我们输入完密码后又要输入一个回车,所以回车也被存储到了输入缓冲区中。而回车是为了让之前的数组进入到input中去,并没有被scanf中的input带走。所以这时候缓冲区中就有了一个\n。当程序向下执行时,getchar从缓冲区拿东西,如果缓冲区中没有东西,他会等我们输入东西,而这时\n在缓冲区中,直接拿\n不再等待。为了消除这个bug,我们可以把这个\n拿走。只需要在scanf函数后面写上一个getchar(),于是\n就被拿走。程序可以正常运行了。

(修改后的代码)
---
### 3
在修改完上面的bug后,我们接着使用这串代码。当我们输入密码时,给密码中间来个空格会如何--**abcd hehe**。可以明确地知道,input只会把**空格之前的abcd**从输入缓冲区拿走,而 **hehe\**n被留在了输入缓冲区。因此getchar()**只能拿走一个空格**。缓冲区**仍然有hehe\n**,依然无法得到我们想要的效果。为此,我们可以利用循环修改代码清理缓冲区:

---