| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3238 人关注过本帖
标题:请问,关于scanf()在输入纯回车时发生了什么?
只看楼主 加入收藏
bxe
Rank: 1
等 级:新手上路
帖 子:57
专家分:7
注 册:2019-3-21
结帖率:72.22%
收藏
已结贴  问题点数:19 回复次数:7 
请问,关于scanf()在输入纯回车时发生了什么?
程序代码:
    do
    {
        count++;
        pNum = realloc(pNum, count * sizeof(float));

        if(scanf("%f", pNum + count - 1) == 0 )
        return 1;

    }while(*(pNum + count - 1));
程序代码:
#include <stdio.h>
#include <stdlib.h>

float average(float *, int);

int main(void)
{
    float *pNum = NULL;
    int count = 0;
    pNum = malloc(count * sizeof(float));

    do
    {
        count++;
        pNum = realloc(pNum, count * sizeof(float));
        scanf("%f", pNum + count - 1);
    }while(*(pNum + count - 1) != 0.0f);

    printf("average = %f\n", average(pNum, count-1));

    return 0;
}

float average(float *pNum, int count)
{
    float sum = 0.0f;
    for(int i = 0; i < count; i++)
    {
        sum += *(pNum + i);
    }
    return sum/count;
}
习题8.1 定义一个函数,给函数传送任意多个浮点数,计算出这些数的平均值。从键盘输入任意个值,并输出平均值,以说明这个函数的执行过程。

书上的练习题答案,来源网友,虽然试着自己写,但连分配内存都想不到,还不行啊..

第一段do while()是我试着改写的,目的是在只输入回车时结束读入。(但不成功)
第二段完整代码是网友的答案,但他特别喜欢用do while(!= 0), 这样读入浮点数再计算平均值有个问题,就是输入中有0这个数字。
ps:答案没释放内存

请问:
1,答案代码,在输入为纯回车时,count不增加,是什么道理?
比如输入:1回车2回车3回车4回车回车回车0 ,输出为2.5(理想值).
按个人的理解,回车一次就会结束scanf()去进行while()判断,然后返回到do(),进而count++。
2, do while()循环,在do的函数体中,使用break ,是结束整个循环么(怕被百度,就写了个测试)
程序代码:
#include <stdio.h>

int main()
{
   int i = 0;/*没有这个不行*/

    do
    {
        i = 0;
        i++;
        break;
        i++;
    }while(i<10);

    printf("%d\n",i);
    return 0;
}
do 和while 似乎算一个整体?,但是i的 作用域 还是在第二对大括号之间?(不在main()中声明不行);
像for()那种在大括号外声明变量,又是怎么回事呢?


[此贴子已经被作者于2019-4-25 02:33编辑过]

搜索更多相关主题的帖子: 回车 do count float while 
2019-04-25 01:34
ZJYTY
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:92
专家分:700
注 册:2018-12-20
收藏
得分:9 
1、scanf函数为阻塞函数,调试可以发现输入纯回车并没有结束阻塞。具体原因可以参考scanf源代码
http://

2、break功能:跳出所在循环
如下,则跳出循环1
程序代码:
do 
    {
        //循环2
        do 
        {
            //循环1
            //...
            break;
        } while (1);

        //...

    } while (1);

-------------------------------若有不当之处,敬请谅解-------------------------------
2019-04-25 09:12
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
别一下子问那么多,你的问题本身“稀里糊涂”的,搞懂一个是一个。

关于scanf()在输入纯回车时发生了什么?
不知道,因为这取决于第一个参数 --- 也就是格式化字符串 --- 的具体内容。
scanf("%f",……) 执行时,略过所有空白字符(回车也是空白字符之一),然后以浮点格式读取字段。scanf返回读取成功的字段数目,除非一开始就遇到错误(无数据可读也是错误之一),这种情况下返回EOF。
所以正常代码就应该是我之前贴给你的
程序代码:
#include <stdio.h>

int main( void )
{
    size_t count = 0;
    double sum = 0.0;

    for( double val; scanf("%lf",&val)==1; ++count )
        sum += val;

    printf( "平均值是 %f\n", count==0 ? 0 : sum/count );
}
但你依然在问这个问题,那我猜你是不知道怎么结束 for( double val; scanf("%lf",&val)==1; ++count ) 这个循环。
怎么结束这个循环不是C/C++的内容,是操作系统的内容。(你既然都应该开始写代码了,那大家自然认为你 识字、会敲键盘、懂得你所使用的操作系统的基本操作、……)
我不知道你用什么操作系统,在 windows 中使用 CTRL+Z 终止输入,在 linux 中使用 CTRL+D 终止输入,其它系统自己查手册。


2019-04-25 09:21
bxe
Rank: 1
等 级:新手上路
帖 子:57
专家分:7
注 册:2019-3-21
收藏
得分:0 
回复 3楼 rjsp
原来是这样啊!是真不知道ctrl+z +回车也能结束输入啊,555
2019-04-25 23:25
bxe
Rank: 1
等 级:新手上路
帖 子:57
专家分:7
注 册:2019-3-21
收藏
得分:0 
回复 3楼 rjsp
for( double val; scanf("%lf",&val)==1 && scanf("%lf,&val")!=EOF; ++count )
请问这样写对么?写两次scanf()会出错么? 因为直接写 && !=eof 似乎不行,试着用了括号也不行


[此贴子已经被作者于2019-4-25 23:43编辑过]

2019-04-25 23:40
bxe
Rank: 1
等 级:新手上路
帖 子:57
专家分:7
注 册:2019-3-21
收藏
得分:0 
回复 3楼 rjsp
for( double val; scanf("%lf",&val)==1 && scanf("%lf,&val")!=EOF; ++count )
请问这样写对么?写两次scanf()会出错么? 因为直接写 && !=eof 似乎不行,试着用了括号也不行
2019-04-26 00:52
bxe
Rank: 1
等 级:新手上路
帖 子:57
专家分:7
注 册:2019-3-21
收藏
得分:0 
回复 3楼 rjsp
程序代码:
#include <stdio.h>

int main(void)
{
    float number = 0;

    for( ; scanf("%d, &number") == 1 ; )
    {
        if(number = EOF) /*之后发现并不是它结束了输入*/
            break;

    }
    return 0;
}
一开始我以为是要这么写,之后发现for()函数体为空 使用ctrl+z+回车 就能结束输入,
请问 EOF 是算作单字符还是字符串(-1?)?
能存储在浮点数变量中么(实际有没有触发存储呢?)?
再使用if(number = EOF)这样判断可以么?
可以理解为ctrl+z = eof  吗?(win操作系统)
我好想搞错了,实际上不需要用到eof么... 老哥的意思是使用ctrl+z 使scanf()的返回值 不等于1来结束循环么。。
老哥能讲讲么,我看的书上还没出现过,是在你之前的回复里看见的..(百度了又是常量,又是-1,又是信号值)
另外,关于判断语句中有没有出现多次需要把scanf()放到等号左边的情况呢?
比如 scanf("%d"&i) 需要他的返回数  等于1  不等于2(假设这个函数不止3个返回值)
我就只能写成 scanf("%d",&i) == 1 && scanf("%d",&i) !=2
这样两次提到sanf()(参数相同)可以么?
应该怎么写呢?

拜谢!


程序代码:
#include <stdio.h>

int main()
{
   float number = 0.0f;

   do
   {
       if(; scanf("%f", &number) == 1 ;) /*傻了,傻了 if for 都用不明白*/



   }while(true);

    return 0;
}
写了这样的测试,但找不到错误在哪..(之后发现了错误)


[此贴子已经被作者于2019-4-26 06:49编辑过]

2019-04-26 04:58
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:10 
for( double val; scanf("%lf",&val)==1 && scanf("%lf,&val")!=EOF; ++count )
请问这样写对么?写两次scanf()会出错么? 因为直接写 && !=eof 似乎不行,试着用了括号也不行
看不懂你想干什么,既然==1了,那就必然!=EOF。

for( ; scanf("%d, &number") == 1 ; )
应该是 for( ; scanf("%f", &number) == 1 ; ) 吧

请问 EOF 是算作单字符还是字符串(-1?)?
能存储在浮点数变量中么(实际有没有触发存储呢?)?
再使用if(number = EOF)这样判断可以么?
EOF 是 scanf 的可能返回值,scanf的返回类型是 int。

可以理解为ctrl+z = eof  吗?(win操作系统)
不可以。在windows console中,使用Ctrl+Z来终止输入,而非有个叫“EOF”的东西被输入成功。

比如 scanf("%d"&i) 需要他的返回数  等于1  不等于2(假设这个函数不止3个返回值)
我就只能写成 scanf("%d",&i) == 1 && scanf("%d",&i) !=2
还是看不懂,既然==1了那么必然!=2呀。
假如你一定要这么写,那应该是 for( int ret; ret=scanf(……), ret==1 && ret!=2; ){}

其它听不懂的问题 我就略过了


2019-04-26 08:46
快速回复:请问,关于scanf()在输入纯回车时发生了什么?
数据加载中...
 
   



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

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