鱼C论坛

 找回密码
 立即注册
查看: 1619|回复: 0

[技术交流] C++(2nd for one)

[复制链接]
发表于 2021-1-30 17:57:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 一叶枫残 于 2021-2-8 17:58 编辑

上一节课后思考作业
要求:编写一个程序,要求用户输入一串整数和任意数目的空格,这些整数必须位于同一行中,但允许出现在该行中的任何位置。当用户按下键盘上的
“Enter”键时,数据输入结束,程序自动对所有的整数进行求和并打印出结果。
小甲鱼实现的C语言版本为:
#include <stdio.h>
#include <stdlib.h>

using namespace std;

int main()
{
        int i;
        int sum=0;
        char ch;
        
        printf("请输入一串整数和任意数目的空格:"); 
        
        while(scanf("%d",&i) == 1)
        {
                sum += i;
                
                while( (ch = getchar()) == ' ')
                {
                        ;
                }
                
                if ( ch == '\n')
                {
                        break;
                }
                
                ungetc( ch , stdin );
        }
        printf("结果是:%d",sum);
        printf("\n");
        system("pause");
}

我以我的理解和方法来解释一下其中的ungetc函数原理
我们以输入13   24     358   4     56来运行程序来解释,我会逐步分析

(我们采取输入流的方法来解释,这里的输入流是我自己理解的输入流,至于与输入流的真正意义有什么区别我不太清楚,看就OK了,很容易理解,先说明一点:输入流(我理解的输入流)是从头流入程序的)

情况1:没有ungetc( ch , stdin );
输入13   24     358   4     56
未执行时,输入流为13   24     358   4     56

第一次循环:i读到了输入流中的13,加进sum,while( (ch = getchar()) == ' ')把空格滤掉,ch读到下一个数24中的2,把2给读进了ch同时把2流出了输入流,输入流变为:4     358   4     56;

第二次循环:i读到了输入流中的4,加进sum,while( (ch = getchar()) == ' ')把空格滤掉,ch读到下一个数358中的3,把3给读进了ch同时把3流出了输入流,输入流变为:58   4     56;

第三次循环:i读到了输入流中的58,加进sum,while( (ch = getchar()) == ' ')把空格滤掉,ch读到下一个数4中的4,把4给读进了ch同时把4流出了输入流,输入流变为:     56;

最后一次循环:i读到了输入流中的56,加进sum,while( (ch = getchar()) == ' ')中第一次就读到回车也就是'\n',if语句判断为真break退出循环;

于是这样情况下的输出的数就由13+24+358+4+56变成13+4+58+56了;

情况2:有ungetc( ch , stdin )
输入13   24     358   4     56
未执行时,输入流为13   24     358   4     56
第一次循环:i读到了输入流中的13,加进sum,while( (ch = getchar()) == ' ')把空格滤掉,ch读到下一个数24中的2,把2给读进了ch同时把2读出了输入流,输入流变为4     358   4     56,但是ungetc( ch , stdin )的作用是把ch的值返回给输入流,也就是把ch的值2返回给输入流,输入流又变为24     358   4     56;

第二次循环:i读到了输入流中的24,加进加进sum,while( (ch = getchar()) == ' ')把空格滤掉,ch读到下一个数358中的3,把3给读进了ch同时把3读出了输入流,输入流变为58   4     56,但是ungetc( ch , stdin )的作用是把ch的值返回给输入流,也就是把ch的值3返回给输入流,输入流又变为358   4     56;

后面的循环也是这样的情况,就不多啰嗦了,最后输出的值就为正确的13+24+358+4+56。


当输入带其他字符的情况,例如带字母和标点符号,程序只会计算遇到第一个非数字和空格前的输入流加起来的值,
例如输入14    24a5  25 s   2s55
第一个非数字和空格的输入为24a5中的a,此时a前面的输入流为14    24,程序就只会计算这段输入流加起来的值,最后输出结果为14+24=38
原因:while(scanf("%d",&i) == 1)语句当读到a时,scanf("%d",&i) == 0,while语句判断为假,直接退出了循环。

途中调试遇到的问题:
dev c++中调试查看面板不要试图去查看scanf("%d",&i)值,如下图,
你会发现调试的时候怎么点下一步都不会有什么反应,但是去掉查看值重新调试时又好了

QQ截图20210130173938.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 01:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表