我在scanf()遇到的一个小问题

Q:

为什么输入了数字后cnt还是0 ?

#include<bits/stdc++.h>
using namespace std;
int arr[1001]={};
int main(){
    int k=0,cnt=0;
    while(scanf("%d",&arr[k++])!=EOF){
        cnt+=arr[k];
    } 
    k--;
    cout<<cnt*pow(2,k-1);
    return 0;
}

A:

问题就出在这:

&arr[k++]

Are your getting it?

k始终指向未输入的位置

说人话就是:那个while循环里的k++,在你的cnt累加前已经被加一了。这就导致你的cnt累加永远访问的是输入后的下一个元素,所以累加的都是0,就输出了0。

S:

WAY 1

cnt+=arr[k-1];

WAY 2

&arr[++k]

One more thing

这下应该真的搞懂了 [k++][++k] 的区别了吧(づ ̄ 3 ̄)づ

关于EOF(end of file)你需要知道这些:

1.C中常见用法之一(如有,补!)

#include <stdio.h>
int main(){
	int n;
while(scanf("%d",&n) != EOF){ 
	
}
	return 0;
}

在这"scanf("%d",&n) != EOF"相当于"scanf("%d",&n) != EOF",或"~scanf("%d",&n)",或"scanf("%d",&n) == 1" 。

scanf的返回值由后面的参数决定

那有同学就要问了,手动输入时这个程序如何结束呢?

在终端(黑框)中手动输入时,系统并不知道什么时候到达了所谓的“文件末尾”,因此需要用Ctrl + z,再按 Enter 的方式来告诉系统已经EOF,这样系统才会结束while.

2.C++中一般用这个

while ((cin >> a) != 0)

cin是C++的输入流对象,">>"是重载的运算符,cin>>的返回值是cin对象。用这个当条件的话,通过检测其流的状态来判断结束; (1)若流是有效的,即流未遇到错误,那么检测成功; (2)若遇到文件结束符,或遇到一个无效的输入时(例如本题输入的值不是一个整数),istream对象的状态会变为无效,条件就为假;读取失败的时候,就不能继续读取了,那么读取操作结束,while(cin>>a)就返回false,跳出循环!

或者说,利用C++中的

while (cin>>n,n)

输入一个数,这数不为0时进入循环,为0时跳出循环。


THE END

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值