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



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

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