| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 390 人关注过本帖
标题:为什么在第二次使用时程序会出错?
只看楼主 加入收藏
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
结帖率:97.22%
收藏
已结贴  问题点数:20 回复次数:6 
为什么在第二次使用时程序会出错?
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#define A 128

int main(void)
{
    char a[A];
    char *pS[A]={NULL};
    char answer='0';
    int i=0;
    int m=0;
    int ji=0;
    double n=0.0;

    printf("请输入任意个浮数点,若要运算请输入end\n");
        printf("请输入:\n");
    do
    {
        n=0;
        i=0;
        if(ji!=0)
        printf("请输入:\n");
        ji++;
        while(strcmp(fgets(a,A,stdin),"end\n")!=0&&i<A)
        {
            pS[i]=(char*)malloc(strlen(a)+1);
            if(pS[i]==NULL)
            {
                printf("内存失败,程序终止\n");
            return 1;
            }
        strcpy(pS[i++],a);
        }
        for(m=0;m<i;m++)
        {
                n+=atof(pS[m]);
                free(pS[m]);
                pS[m]=NULL;
        }
        printf("平均值为 :%4lf\n",n/(double)m);
        printf("你还需要使用吗?(y\\n):");
        scanf("%c",&answer);
        }while(tolower(answer)=='y');
   
    return 0;
}
搜索更多相关主题的帖子: include double 
2012-10-29 23:23
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
在输入y之后再计算平均值时程序会多除以1,是什么导致的?

I have not failed completely
2012-10-29 23:24
a646404908
Rank: 6Rank: 6
等 级:侠之大者
威 望:5
帖 子:189
专家分:492
注 册:2012-2-14
收藏
得分:0 
需要这么复杂吗
2012-10-29 23:33
obstratiker
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:198
专家分:758
注 册:2011-5-5
收藏
得分:20 
scanf("%c",&answer);
这里输入时遗留了一个'\n'
所以下次循环到while(strcmp(fgets(a,A,stdin),"end\n")!=0&&i<A)
时'\n'会干扰输入
在while(strcmp(fgets(a,A,stdin),"end\n")!=0&&i<A)
前加上 fflush(stdin) 就行了
2012-10-30 08:00
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
我试过了,第二次计算时除以总和还是多了1,你自己调试了没?不会是编辑器不同吧?

I have not failed completely
2012-10-30 20:01
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
刚刚我把清空缓冲区的指令加错地方了,现在行了,不过我在那个地方只使用了scanf作为读入,为什么会遗留下'\n'呢?能不能讲解一下,非常感谢

I have not failed completely
2012-10-30 20:10
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
一旦用户输入的不是整数(如小数或者字母),假设 scanf 函数最后一次得到的整数是 2 ,那么程序会不停地输出“Please input an integer: 2”。这是因为 scanf("%d", &i); 只能接受整数,如果用户输入了字母,则这个字母会遗留在“输入缓冲区”中。因为缓冲中有数据,故而 scanf 函数不会等待用户输入,直接就去缓冲中读取,可是缓冲中的却是字母,这个字母再次被遗留在缓冲中,如此反复,从而导致不停地输出“Please input an integer: 2”。
  就像2楼说的:“居然这样,那么在 scanf 函数后面加上‘fflush(stdin);’,把输入缓冲清空掉不就行了?”然而这是错的!C和C++的标准里从来没有定义过 fflush(stdin)。也许有人会说:“可是我用 fflush(stdin) 解决了这个问题,你怎么能说是错的呢?”的确,某些编译器(如VC6)支持用 fflush(stdin) 来清空输入缓冲,但是并非所有编译器都要支持这个功能(linux 下的 gcc 就不支持),因为标准中根本没有定义 fflush(stdin)。MSDN 文档里也清楚地写着fflush on input stream is an extension to the C standard(fflush 操作输入流是对 C 标准的扩充)。当然,如果你毫不在乎程序的移植性,用 fflush(stdin) 也没什么大问题。以下是 C99 对 fflush 函数的定义:

  int fflush(FILE *stream);

  如果 stream 指向输出流或者更新流(update stream),并且这个更新流最近执行的操作不是输入,那么 fflush 函数将把这个流中任何待写数据传送至
宿主环境(host environment)写入文件。否则,它的行为是未定义的。原文如下:

  int fflush(FILE *stream);

If stream points to an output stream or an update stream in whichthe most recent operation was not input, the fflush function causesany unwritten data for that stream to be delivered to the host environmentto be written to the file; otherwise, the behavior is undefined.

  其中,宿主环境可以理解为操作系统或内核等。由此可知,如果 stream 指向输入流(如 stdin),那么 fflush 函数的行为是不确定的。故而使用 fflush(stdin) 是不正确的,至少是移植性不好的。


我找了篇相关文章,学到了不少

I have not failed completely
2012-10-30 20:19
快速回复:为什么在第二次使用时程序会出错?
数据加载中...
 
   



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

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