浙大PAT乙级1054-测试点2

代码如下:
请问为何第45行需要atof测试点2才能正确,但是atoi不行?
我的思路是在这个else当中小数点个数为0了,如果整数部分有数字,那么字符串就是个整数了,只需要atoi即可。

//一个“合法”的输入是 [−1000,1000] 区间内的实数,并且最多精确到小数点后 2 位
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int isLegal(char a[]){
    int i,len = strlen(a);
    int isNegative = 0;//是否是负数
    int ispoint = 0;//有几个小数点
    int num_xs = 0;//小数的位数
    int num_zs = 0;//整数的位数
    for (i=0;i<len;i++)
    {
        if (i==0 && a[i]=='-')
            isNegative = 1;//是负数
        else if (a[i]>47 && a[i]<59)
        {
            if (ispoint==1)
                num_xs++;
            else if (ispoint==0)
                num_zs++;
            else//多个小数点是错误的
                return 0;
        }
        else if (a[i]=='.')
        {
            ispoint++;
            if (ispoint>1)
                return 0;
        }
        else
            return 0;
    }
    if (ispoint>1)
        return 0;
    else if (ispoint==1)//小数点前后均不允许没有数字,且该实数需要满足范围
    {
        if (num_zs>0 && num_xs<3 && abs(atof(a))<=1000)
            //小数点需要整数位,小数位数不得超过2,[−1000,1000]
            return 1;
        else
            return 0;
    }
    else//没有小数点
    {
        if (num_zs>0 && abs(atof(a))<=1000)//要有数字,排除仅为负号的情况
            return 1;
        else
            return 0;
    }
}

int main(){
    int N,i,k = 0;
    char temp[10001];
    long double sum = 0;
    scanf("%d",&N);
    for (i=0;i<N;i++)
    {
        scanf("%s",temp);
        if (isLegal(temp)==1)
        {
            sum+=atof(temp);
            k++;
        }
        else
            printf("ERROR: %s is not a legal number\n",temp);
    }
    if (k==0)
        printf("The average of 0 numbers is Undefined\n");
    else if (k==1)
        printf("The average of 1 number is %0.2llf\n",sum);//精确到小数点后 2 位
    else
        printf("The average of %d numbers is %0.2llf\n",k,sum/k);
    return 0;
}

同问

供参考:

#include <stdio.h>
#include <string.h>
#include <math.h>
int Str_cmp(char str1[], char str2[])
{
    int len1 = strlen(str1), i;
    for (i = 0; i < len1; i++) {
        if (str1[i] != str2[i]) {
            return 1;
        }
    }
    return 0;
}
int main()
{
    int n;
    scanf("%d", &n);
    int k = n, i;
    double sum = 0.0;
    char str1[50], str2[50]; 
    for (i = 0; i < n; i++) {
        double tmp;
        scanf("%s", str1);
        sscanf(str1, "%lf", &tmp);  
        sprintf(str2, "%.2lf", tmp);
        if (fabs(tmp) <= 1000 && !Str_cmp(str1, str2)) {
            sum += tmp;
        }
        else {
            k--;   
            printf("ERROR: %s is not a legal number\n", str1);
        }
    }
    if (!k) {
        printf("The average of 0 numbers is Undefined");
    }
    else if (k == 1) {
        printf("The average of 1 number is %.2lf", sum);
    }
    else {
        printf("The average of %d numbers is %.2lf", k, sum / k);
    }
    return 0;
}