A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


    char ch;
    scanf("%c",&ch);
    while (ch!='\n') {
        count++;
        scanf("%c",&ch);
    }
   
    printf("count = %d\n",count);

10 个回复

倒序浏览
1. 在执行scanf函数的时候,会让用户输入1个数据.
     数据输入完毕之后,并不是将这个数据直接赋值给变量.
     而是先将数据存储在缓冲区 输入的任何数据都会存储在缓冲区中.

  2. 在执行scanf函数的时候.会先检查缓冲区中是否有数据.
     如果缓冲区中没有数据.那么就会让用户从键盘输入.
     如果缓冲区中有数据. 直接从缓冲区中将数据拿出来. 不会让用户输入数据.


  3. 当从缓冲区中拿数据的时候,如果要拿的数据的类型是整型或者实型.
     如果拿到的是空格 回车 Tab键 就会被自动忽略.继续往下拿.

     如果要拿的数据的类型是字符型.不会忽略任何数据.
     所以.当我们数字和字符混合输入的时候.字符的接收就有可能会出问题.


     解决方案: 在输入字符之前,将缓冲区中的数据全部清空.

     rewind(stdin);
回复 使用道具 举报
一个水果(char)篮,里面有香蕉(int),苹果(float),葡萄(double)等等

叫你拿香蕉,你就只会拿香蕉
叫你拿苹果,你就只会拿苹果,
叫你拿水果呢.

系统会把缓冲区所有的内容都识别成char类型

你自己看看ascii表就懂了
回复 使用道具 举报
简单说缓冲区就是一个池子.把输入的文件汇总到这个池子里面.然后计算机再从池子里读取.首先count没有声明和初始化.其次程序的目的是检测又没有遇到换行(\n).当你第一次输入一个字符('a'),并以回车结束后.进入while的条件判断('a' != '\n'成立),进入循环count自增.然后要求再次输入.但是这时池子里面还有你上次剩下的回车,计算机就会直接读取这个回车.再次回到循环条件判断时条件不成立.巴拉巴拉
回复 使用道具 举报
现在看了大家的解释,感觉更清晰了
回复 使用道具 举报
何必ˇㄨ那么假 发表于 2016-3-16 00:44
1. 在执行scanf函数的时候,会让用户输入1个数据.
     数据输入完毕之后,并不是将这个数据直接赋值给变量.
...

非常感谢
回复 使用道具 举报
我是王觉瘦 发表于 2016-3-16 01:44
简单说缓冲区就是一个池子.把输入的文件汇总到这个池子里面.然后计算机再从池子里读取.首先count没有声明和 ...

您精准的回答了我提出的问题,给我解惑了。
我非常感谢。
回复 使用道具 举报
菜逼 发表于 2016-3-16 00:50
一个水果(char)篮,里面有香蕉(int),苹果(float),葡萄(double)等等

叫你拿香蕉,你就只会拿香蕉

哥们你举的真通俗,但是
我有点疑惑,是不是定义变量时都可以定义为char型,因为它适合所有格式
char type = 'a'/ type = 1 /type = 1.00f /type  = 1.1
这样行吗?
回复 使用道具 举报
chensc 金牌黑马 2016-3-16 20:19:02
9#
学习学习!
回复 使用道具 举报
66 加油 加油
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马