| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1482 人关注过本帖
标题:C语言新手, 求大神解答关于scanf缓存区的问题
只看楼主 加入收藏
luanyu666
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2015-6-15
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:11 
C语言新手, 求大神解答关于scanf缓存区的问题
最近刚开始用scanf 发现了缓存区有几个问题 求大神解答
第一个程序
char l;
    while (!islower(l))
   {
        printf("Please enter a letter:");
        scanf("%c",&l);
        setbuf(stdin,NULL);
   }
当我不加最后一行清理缓存的话,如果我输入了A等大写字母,会打印两次Please enter a letter:。 这是因为\n被读入了缓存区吗?那为什么两次之后就又可以输入了?

第二个程序
a=0;
while (a == 0)
    {
        printf("Please input the coefficient of the x^2, x and constant.\n");
        printf("Please divide them by commas:");
        scanf("%f,%f,%f",&a,&b,&c);
    }
这里我感觉和上面一个程序差不多,但是如果我a输了等于0, 不用清理缓存区还是能够在下一次循环就能输入。这又是为什么?就算是
scanf("%f",&a);也是每一次循环都可以输入?
求大神解答!谢谢~
搜索更多相关主题的帖子: letter C语言 电子 服装 
2015-06-15 20:10
hjx1120
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:李掌柜
等 级:贵宾
威 望:41
帖 子:1314
专家分:6927
注 册:2008-1-3
收藏
得分:5 
程序1不一定要清理缓存区的,也可以过滤掉'\n'
如:
while(l=getchar() != '\n')
            continue;

这段代码就可以过滤掉回车符
#include<stdio.h>
#include<ctype.h>
int main(void)
{
    char l;
    while(!islower(1)){
        printf("Please enter a letter:");
        scanf("%c",&l);
        while(l=getchar() != '\n')
            continue;
    }
    return 0;
}
2015-06-15 20:24
luanyu666
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2015-6-15
收藏
得分:0 
回复 2楼 hjx1120
我感觉1和2程序都差不多。。为什么2就不用清理了?谢啦~
2015-06-15 20:26
hjx1120
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:李掌柜
等 级:贵宾
威 望:41
帖 子:1314
专家分:6927
注 册:2008-1-3
收藏
得分:0 
同理,程序2也同样可以用这个方法过滤掉回车符
楼主你可知:Please input the coefficient of the x^2, x and constant
是啥子意思还用a==0做退出loop的条件?



[ 本帖最后由 hjx1120 于 2015-6-15 21:00 编辑 ]
2015-06-15 20:35
luanyu666
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2015-6-15
收藏
得分:0 
回复 4楼 hjx1120
额不好意思,可能是我没有讲清楚,我想问的问题是为什么1和2差不多,但是如果我的输入不符合条件,2在下一次循环就能再次输入但是1会在两次循环之后才能输入。。谢
2015-06-15 20:38
hjx1120
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:李掌柜
等 级:贵宾
威 望:41
帖 子:1314
专家分:6927
注 册:2008-1-3
收藏
得分:0 
回复 5楼 luanyu666
决对是不一样的,我只是一个小白,说不清楚,座等高手指点迷津
2015-06-15 20:52
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2277
专家分:10647
注 册:2015-3-19
收藏
得分:5 
第一个程序
char l;
    while (!islower(l))
   {
        printf("Please enter a letter:");
        scanf("%c",&l);printf("\nl=%d\n",l);
        setbuf(stdin,NULL);
   }
当我不加最后一行清理缓存的话,如果我输入了A等大写字母,会打印两次Please enter a letter:。 这是因为\n被读入了缓存区吗?那为什么两次之后就又可以输入了?
加一行printf("\nl=%d\n",l);看看输入值不就好了
第二个程序
a=0;
while (a == 0)
    {
        printf("Please input the coefficient of the x^2, x and constant.\n");
        printf("Please divide them by commas:");
        scanf("%f,%f,%f",&a,&b,&c);
printf("a=%f\tb=%f\tc=%f",a,b,c);
    }
这里我感觉和上面一个程序差不多,但是如果我a输了等于0, 不用清理缓存区还是能够在下一次循环就能输入。这又是为什么?就算是
scanf("%f",&a);也是每一次循环都可以输入?
和上面不一样的是2处理的是浮点型数值,想了解a,b,c有没有被赋值同样加:
printf("a=%f\tb=%f\tc=%f",a,b,c);

剑栈风樯各苦辛,别时冰雪到时春
2015-06-15 20:53
luanyu666
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2015-6-15
收藏
得分:0 
回复 7楼 林月儿
懂了,谢谢
2015-06-15 20:56
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2277
专家分:10647
注 册:2015-3-19
收藏
得分:0 
回复 8楼 luanyu666
编译器的rule编译器是不会撒谎的,不要瞎猜,问编译器就好

剑栈风樯各苦辛,别时冰雪到时春
2015-06-15 21:06
取名字
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:236
专家分:924
注 册:2015-4-27
收藏
得分:5 
因为楼主的第一个程序:scanf("%c",&l);只要求读入一个字符,当你输入的时候,先输入一个字母'a',然后敲回车,该语句将字母'a'从缓冲区读出赋给变量l,而把回车符留在了缓冲区,等到下一次执行到scanf("%c",&l)时,因为缓冲区留有上一次遗留下来的回车符,所以直接从缓冲区中读出回车符赋给变量l,然后回到while(!islower(l))去执行;
第二个程序scanf("%f,%f,%f",&a,&b,&c);是要求输入一个浮点值,它会从第一个不是空白字符的有效字符开始读入数据,所以自动忽略掉了上一次在缓冲区中留下的回车符。
情况就是这样。
2015-06-16 09:24
快速回复:C语言新手, 求大神解答关于scanf缓存区的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016352 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved