读书人

求帮忙。该怎么处理

发布时间: 2013-04-20 19:43:01 作者: rapoo

求帮忙。。
#include<stdio.h>
int pd(int n)
{
int i;
int k=1;
for(i = 2;i<n;i++){
if(n%i==0){
k=0;
break;
}
}
return k;
}

int main()
{
int n, k = 0;
double sum1 = 0.0;
double avr =0.0;
FILE *fp = fopen("data.in","r");
while(!feof(fp)){

fscanf(fp, "%d", &n);
if(pd(n)){
printf("%d ", n);
sum1=sum1+n;
k=k+1;
}
avr=sum1/k;
}
printf("\n%lf %d\n",sum1,k);
printf("\n%.2lf\n",avr);
}


data.in里的文件是
2 4 5
为什么输出n的时候输出的是
2 5 5 ?
应该是
2 5
的啊?多了一个5怎么回事?
[解决办法]
你把data.in用UE在16进制编辑器里看看,应该是:

32 20 34 20 35 0D 0A

你把0D删除后,应该就可以得到2 5的结果了

[解决办法]
请判断fscanf函数的返回值!

不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
if (条件1) break;
//...
if (条件2) continue;
//...
if (条件3) return;
//...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
whlie (!feof(f)) {
a=fgetc(f);
//...
b=fgetc(f);//可能此时已经feof了!
//...
}
而这样写就没有问题:
whlie (1) {
a=fgetc(f);
if (feof(f)) break;
//...
b=fgetc(f);
if (feof(f)) break;
//...
}
类似的例子还可以举很多。

读书人网 >C++

热点推荐