鱼C论坛

 找回密码
 立即注册
楼主: 小甲鱼

[函数快查] getchar -- 从标准输入流中获取字符

[复制链接]
发表于 2018-7-27 17:23:47 | 显示全部楼层
它获取的是下一个字符,那第一个字符怎么获取呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2018-9-1 15:39:26 | 显示全部楼层
本帖最后由 21228827 于 2018-9-1 15:50 编辑

getchar()函数执行一次会从键盘缓冲区(如果有内容就读取,没有内容就等待用户输入并以回车结束,回车相当于加上一个换行符\n)顺序读取一个字符并返回此ASCII码,举个例子:当我们调用一次getchar()时,然后输入abc并回车,此时abc和\n才一起送入了键盘缓冲区,总共就是4个字符。而此时getchar()由于只运行了一次,所以取到的是a,剩下缓冲区的字符就是bc\n 源程序里while(getchar()!='\n')意思就是一个一个字符读取,直到碰到\n也就是回车就停止(当然\n也就不会被计入累加值)。我们在执行此程序时很直观的感受是输入完一个句子,然后回车马上print,其实回车之后又根据句子长度执行了N次(我有点啰嗦了)
还有一个问题就是有朋友提出视频里getchar()过滤回车的问题,其实就是scanf()比如输入Y并回车之后,scanf只读并取走了一个字符,此时\n也就是回车符依然在键盘缓冲区里(有点像getchar()),此时调用getchar()但又不把他的值赋予其他变量,不正好起到了把那个多余的\n用getchar()“过滤掉”的作用吗,使用之后缓冲区就是空的了,下次调用scanf因为是空的,就会等待用户输入,也就自然不会自动取到遗留的\n

我一开始也是没搞懂,后来自己动手写了几次程序才摸懂了原理,表达不是很好,不对的地方请大神指正

  1. #include <stdio.h>
  2. int main(int argc, char *argv[])
  3. {

  4.      char test1;
  5.      char test2;
  6.      char test3;
  7.      char test4;
  8.      
  9.      scanf("请输入:%c%c%c" ,&test1,&test2,&test3);
  10.      test1=getchar();
  11.      test2=getchar();
  12.      test3=getchar();
  13.      test4=getchar();
  14.      printf("test1=%d  test2=%d  test3=%d  test4=%d\n",test1,test2,test3,test4);
  15.      printf("test1=%c  test2=%c  test3=%c  test4=%c\n",test1,test2,test3,test4);

  16.         return 0;


  17. }
复制代码



无标题.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2018-9-8 13:34:57 | 显示全部楼层
不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2018-9-14 21:37:25 | 显示全部楼层

表示有点蒙
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2018-11-8 09:20:29 | 显示全部楼层
我能说没看懂吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2019-1-10 16:33:34 | 显示全部楼层
不是很懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2019-4-19 11:47:02 | 显示全部楼层
getchar 是不是也把换行符给输入进去了?虽然并没有进入while循环。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2019-5-22 15:19:53 | 显示全部楼层
一样啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2019-5-24 20:31:25 | 显示全部楼层
21228827 发表于 2018-9-1 15:39
getchar()函数执行一次会从键盘缓冲区(如果有内容就读取,没有内容就等待用户输入并以回车结束,回车相当于 ...

感谢,终于看懂了。。。试了一下,发现确实是只获取一个字符,在过滤回车那个视频里面的代码运行时,女神是否有空,在输入Y之后加一个空格再回车,发现getchar确实失效了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2019-7-30 16:23:58 | 显示全部楼层
加快进度!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2019-9-26 11:15:41 | 显示全部楼层
做课后作业遇到一个问题
#include<stdio.h>
int main()
{
        int h,ch=0;
        printf("请输入一个英文句子:");
        while(getchar() != '\n')
        {
                if(getchar() ='A'&&getchar() <='C')
                {
                        ch=ch+1;
                }
        }
        printf("你一共输入了%d个大写字母!\n",ch);
        return 0;
}
像这样不将getchar赋值为整形变量,直接比较的话程序就会报错,是运算符两边是表达式的原因吗,函数的返回值不能用getchar()直接表示吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2019-11-28 18:02:58 | 显示全部楼层
#include <stdio.h>

int main()
{
        int c = 0;
        printf("请输入一行英文:");
        while (getchar() < 91)
        {
                c = c + 1;
        }
        printf("你一共输入了%d个大写字母", c);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2019-12-14 12:07:32 | 显示全部楼层
还是不知道
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2019-12-15 20:35:05 | 显示全部楼层
21228827 发表于 2018-9-1 15:39
getchar()函数执行一次会从键盘缓冲区(如果有内容就读取,没有内容就等待用户输入并以回车结束,回车相当于 ...


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2020-1-14 10:32:44 | 显示全部楼层
re-born 发表于 2017-1-19 12:34
为什么这个输入的语句不需要scanf来装?

同问
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2020-2-7 21:47:39 | 显示全部楼层
本帖最后由 ikwen 于 2020-2-7 21:56 编辑

(getchar() != '\n')
就是这里的  !=  没看懂。为什么要加上这个呢:

我知道了,只有不等于回车,才会执行计数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2020-2-15 22:15:52 | 显示全部楼层
21228827 发表于 2018-9-1 15:39
getchar()函数执行一次会从键盘缓冲区(如果有内容就读取,没有内容就等待用户输入并以回车结束,回车相当于 ...

感觉你说的是对的,给你点赞!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2020-2-17 19:01:01 From FishC Mobile | 显示全部楼层
lntouchables 发表于 2017-6-2 21:13
#include

int main()

这个while后真的有分号吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2020-3-3 18:24:31 | 显示全部楼层
小谨谨 发表于 2019-9-26 11:15
做课后作业遇到一个问题
#include
int main()

你这一个循环里面getchar就运行了三次,依次读取了三次缓冲区。应该每次循环调用getchar的时候赋值给一个变量保存
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2020-3-6 13:49:59 | 显示全部楼层
学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1

GMT+8, 2020-12-5 11:16

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表