搜索
查看: 2100|回复: 13
打印 上一主题 下一主题

scanf问题

[复制链接]
跳转到指定楼层
楼主
发表于 2013-6-7 17:54:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5啊哈币
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
char a='N';
double b=0.0,
     c=0.0;
int d=0;
printf("\nThis program calculates the average of"
    "ant number of values.");
for(;;)
{
  printf("\n请键入一个数值: ");
  scanf("%lf",&c);
  b += c;
  ++d;
  printf("您想要继续吗?(Y or N): ");
  scanf("%c",&a);
  if(tolower(a) == 'n')
   break;
}
printf("\n这几个数的平均值是%.2lf\n",b/d);
system("pause");
return 0;
}

这段代码很奇怪,第二个scanf("%c",&a);在%c前面加一个空格和不加空格居然有很大的差别,加了后会询问继续,不加的话直接跳过询问,哪位大侠帮忙看一下是怎么回事。谢谢啦。

最佳答案

查看完整内容

你输入第一个数据的时候,最后敲了个回车 这个回车就会留在缓冲区里面 然后就被第二个scanf读取了 如果格式化字符串里面有空格,缓冲区里的回车就会被当做这个空白字符,才能继续输入 比较正统的做法是,在第二个scanf前清空缓冲区连续从缓冲区读取字符,直到读取到一个换行字符。将读取到的字符全部丢弃 还有一种方法,对于微软的编译器有效,不可以移植
沙发
发表于 2013-6-7 17:54:36 | 只看该作者
你输入第一个数据的时候,最后敲了个回车
这个回车就会留在缓冲区里面
然后就被第二个scanf读取了
如果格式化字符串里面有空格,缓冲区里的回车就会被当做这个空白字符,才能继续输入

比较正统的做法是,在第二个scanf前清空缓冲区
  1. while(getchar() != '\n')
  2.   ;
复制代码
连续从缓冲区读取字符,直到读取到一个换行字符。将读取到的字符全部丢弃

还有一种方法,对于微软的编译器有效,不可以移植
  1. fflush(stdin);
复制代码
板凳
 楼主| 发表于 2013-6-7 17:59:18 | 只看该作者
补充,不加空格计算也是错误的,加了才正常。真是糊涂了。
地板
 楼主| 发表于 2013-6-8 08:35:02 | 只看该作者
本帖最后由 chd9527 于 2013-6-8 08:36 编辑

首先谢谢你的意见!

原因应该是你所说的原因,但是第一种方法没有解决问题,第二个scanf是询问了,但是程序的计算和初衷都被改变了。
5#
 楼主| 发表于 2013-6-8 08:35:14 | 只看该作者
第二种我没有试。
6#
 楼主| 发表于 2013-6-8 08:44:45 | 只看该作者
你的意思是不是说凡是读入char类型时,在char之前按过几次回车,就应该留几个空格,这样正确么?
7#
发表于 2013-6-8 11:57:14 | 只看该作者
不知道你说的程序初衷改变指的是什么

不是,scanf的格式化字符串中一个空白字符就可以对应缓冲区中若干空白字符
8#
 楼主| 发表于 2013-6-8 16:57:13 | 只看该作者
噢,知道啦。我得试试看。
我说的初衷是本来是输入几个数求均值,但是如果用了第一种方法,输入几个数求不鸟均值或者求的均值是错误的,你试下看看。
9#
 楼主| 发表于 2013-6-8 16:57:22 | 只看该作者
噢,知道啦。我得试试看。
我说的初衷是本来是输入几个数求均值,但是如果用了第一种方法,输入几个数求不鸟均值或者求的均值是错误的,你试下看看。
10#
发表于 2013-6-8 18:27:36 | 只看该作者
chd9527 发表于 2013-6-8 16:57
噢,知道啦。我得试试看。
我说的初衷是本来是输入几个数求均值,但是如果用了第一种方法,输入几个数求不 ...

没错,不知道你做了什么
11#
 楼主| 发表于 2013-6-9 14:24:47 | 只看该作者
我直接在第二个scanf之前加了这个代码:while(getchar() != '\n');但同好像最后结果还是不行。
12#
发表于 2013-6-9 15:15:04 | 只看该作者
chd9527 发表于 2013-6-9 14:24
我直接在第二个scanf之前加了这个代码:while(getchar() != '\n');但同好像最后结果还是不行。

完整的贴出来我看看
13#
发表于 2013-6-11 19:58:48 | 只看该作者
在下一次 scanf 之前一定要清空缓冲区就对了啊 这里有一个经典的做法
int c;
while((c = getchar()) != '\n' && c != EOF);

来自于 http://www.cnblogs.com/codingmylife/archive/2010/04/18/1714954.html
14#
 楼主| 发表于 2013-6-14 09:17:15 | 只看该作者
真的可以了,太谢谢啦。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表