学习getchar()遇到的缓冲问题

本文详细探讨了C语言中getchar函数的工作原理及其与输入缓冲区的关系,解释了为何输入字符与输出结果出现的差异,并对比了getch、getche等函数的不同。

学习getchar()遇到的缓冲问题
getchar函数在被调用时从文本流中读入下一个输入字符并将其作为结果值返回。(The c programming language,P9)

对于一下程序:
#include <stdio.h>
main()
{
    int c;
   c=getchar();
   while(c!=EOF){
        putchar(c);
       c=getchar();
  }
}

我本来以为如果输入abc↙,输出结果应该为aabbcc↙,其实输出为
abc↙
abc↙
上网查了些资料才大概了解了为什么会这样。

1、c语言中对输入输出设有缓冲区,我们通过键盘输入的字符并不是直接被getchar函数获得,而是先把输入的字符放到缓冲区,getchar再从缓冲区中依次获取字符,这样就可以解释上面的程序的输出结果了。abc先被送入缓冲区,然后getchar依次从缓冲区中读取abc,并通过putchar输出到屏幕上。

以下这段摘自网上:从终端键盘向计算机输入时,是在按Enter键以后才送到内存缓冲区中去的。不是从终端敲入一个字符马上输出一个字符,而是按下Enter键后数据送入内存缓冲区,然后每次从缓冲区读一个字符,再输出该字符。

2、回车符作为一个字符,也会被放入缓冲区,因此也会被getchar和scanf从缓冲区获取。
如以下程序:
#include <stdio.h>
main()
{
 int c;
 c=getchar();
 while(c!=EOF){
  putchar(c);
  c=getchar();
  }
}

如果输入a↙,则输出为a↙,显然回车符↙也被照本输出。如果没认识到这一点,会在实际编程中遇到一些疑惑。
#include <stdio.h>
int main()
            {
            char c1, c2;
            scanf("%c", &c1);
            scanf("%c", &c2);
            printf("c1 is %c, c2 is %c/n", c1, c2);
            return 0;
            }
如果输入a回车后会有什么样的输出呢?结果为:c1 is A, c2 is   ,变量c2输出的是1个换行符(因为字符A后的回车符赋给了c2)。//转自ccpp

3、getch()和getche()函数
    这两个函数都是从键盘上读入一个字符,即时读入,不需先读入缓冲区。。其调用格式为:
  getch();
  getche();
 两者的区别是:getch()函数不将读入的字符回显在显示屏幕上,而getche() 函数却将读入的字符回显到显示屏幕上。

getchar()函数
 getchar()函数也是从键盘上读入一个字符, 并带回显。它与前面两个函数的区别在于: getchar()函数,只有当你按下回车键才从缓冲区读入字符,并且会将回车键也读入。

 

 
<think>嗯,用户问的是关于putchat和getchar,这两个名字看起来有点拼写错误或者可能是打字错误。首先,我得确认正确的术语是什么。通常,在编程中,常见的函数是putchar和getchar,属于C语言的标准库函数,用于字符的输入输出。 首先,可能用户将putchar打成了putchat,多了一个t。同样,getchar是正确的,但需要确认是否有其他库或框架中有类似的函数名。比如,有些非标准库可能会有不同的命名,但标准C中是putchar和getchar。 接下来,我需要回忆这两个函数的具体用法和功能。putchar用于向标准输出(通常是屏幕)写入一个字符,而getchar从标准输入(通常是键盘)读取一个字符。它们的原型在stdio.h头文件中声明。 然后,我需要考虑用户可能的背景。他们可能刚开始学习C语言,或者在编程中遇到了相关的问题,比如字符输入输出的处理。用户的需求可能是了解这两个函数的基本用法,或者解决在使用它们时遇到的问题,比如缓冲问题,输入后的换行符处理等。 另外,用户提到的“putchat”可能是其他编程环境中的函数,比如某些教材或特定平台的自定义函数,但标准C中不存在putchat。需要指出正确的名称,并解释可能的混淆来源。 在组织回答时,应该先纠正可能的拼写错误,然后分别介绍putchar和getchar,包括它们的函数原型、参数、返回值以及使用示例。同时,要提到常见的注意事项,比如getchar()读取输入缓冲区时的行为,可能需要清除缓冲区中的换行符或其他残留字符。 还需要考虑用户可能遇到的典型问题,比如为什么getchar()没有等待输入就直接执行了,这可能是因为输入缓冲区中还有未处理的字符,导致getchar()直接读取了之前的换行符。这时需要解释如何清空输入缓冲区,或者使用其他函数如scanf来处理这种情况。 最后,总结这两个函数在C语言中的重要性,它们作为基本的输入输出函数,在控制台程序中非常常用,帮助用户构建交互式应用。</think>关于您提到的“putchat”和“getchar”,可能存在一些拼写混淆。以下是针对这两个术语的解析: --- ### 一、修正可能的拼写错误 1. **putchat**:C语言标准库中无此函数,推测应为 **`putchar`**(输出单个字符) 2. **getchar**:C语言标准输入函数(正确名称) --- ### 二、`putchar` 函数详解 #### 1. 功能 - 向标准输出(通常是屏幕)写入一个字符 - 对应头文件:`#include <stdio.h>` #### 2. 函数原型 ```c int putchar(int char); ``` - **参数**:`char` 是要输出的字符(以ASCII码形式传入) - **返回值**:成功时返回写入的字符,失败时返回 `EOF` #### 3. 示例 ```c putchar('A'); // 输出字符 A putchar(97); // 输出字符 a(ASCII码 97) ``` --- ### 三、`getchar` 函数详解 #### 1. 功能 - 从标准输入(通常是键盘)读取单个字符 - 对应头文件:`#include <stdio.h>` #### 2. 函数原型 ```c int getchar(void); ``` - **返回值**:读取的字符(以 `int` 类型返回),失败或遇到文件末尾时返回 `EOF` #### 3. 示例 ```c int c = getchar(); // 读取用户输入的一个字符 putchar(c); // 将读取的字符输出 ``` --- ### 四、常见问题与注意事项 1. **输入缓冲问题** `getchar()` 会读取输入缓冲区中的字符(包括换行符 `\n`)。若需清除残留字符,可添加循环: ```c while ((c = getchar()) != '\n' && c != EOF); // 清空缓冲区 ``` 2. **返回值类型** `getchar()` 返回 `int` 而非 `char`,以兼容 `EOF`(通常值为 -1) 3. **典型应用场景** - 实现“按任意键继续”功能 - 逐字符处理输入流 --- ### 五、扩展对比 | 函数 | 方向 | 数据类型 | 典型用途 | |-----------|--------|----------|--------------------| | `putchar` | 输出 | 字符 | 输出单个字符 | | `getchar` | 输入 | 字符 | 读取单个字符输入 | --- ### 六、总结 - `putchar` 和 `getchar` 是C语言中**基础且高效**的字符级输入输出函数 - 需注意输入缓冲区的管理,避免意外读取残留字符 - 两者结合可实现简单的交互式控制台程序 如需进一步示例或问题分析,请提供具体使用场景!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值