检查scanf是否不是浮点数

时间:2018-09-30 01:44:56

标签: c

#define maximum 100 
#include <math.h>
#include <stdio.h>

int main () {

    float sum, mean, variance, difference;
    float sumforvariance, standarddev;
    sumforvariance=0;
    sum=0;
    mean=0;
    variance=0;
    difference=0;
    standarddev=0;

    int a, count, b, c;
    float insertnum[maximum]

    for (a=0; a<maximum; a++) {
            scanf("%f",&insertnum[a]);
            count ++;

            if (insertnum[a]==35.00) {

                    if (count==1) {
                            printf ("no data\n");
                            return 0;
                    }
                    break; 

                }

    }

    for (b=0; b<count; b++) {
            sum+=insertnum[b];
    }
    mean=sum/count;

    for (c=0; c<count; c++) {
            difference=insertnum[c]-mean;
            sumforvariance=sumforvariance+pow(difference,2);
    }
    variance=variance/count;
    standarddev=sqrt(variance);

    printf("mean: %f",mean);
    printf("standdev: %f",standarddev);

嗨,我有一个简单的问题。我正在尝试为一组数字计算标准偏差和均值  ./a.out 12 20 30等#
#是终止输入更多数字。正如您在第一个for循环中看到的那样,我试图将标准输出中的数字输入到浮点数组中。问题是当我输入35时,我不想终止输入更多数字,因为它不等于#。如何输入35并继续输入更多数字,直到输入#,因为它们都包含相同的数值。 #= 35和35 = 35。

2 个答案:

答案 0 :(得分:3)

以字符串形式读取用户输入。嗅探终止条件,然后从字符串转换为浮点数。使用strtof的帮助功能#include <stdlib.h>

#define maximum 100 
#include <math.h>
#include <stdlib.h>
#include <stdio.h>

int main() {

    float sum, mean, variance, difference;
    float sumforvariance, standarddev;
    sumforvariance = 0;
    sum = 0;
    mean = 0;
    variance = 0;
    difference = 0;
    standarddev = 0;

    int a, count=0, b, c;

    float insertnum[maximum];

    for (a = 0; a < maximum; a++) {

        char userinput[101] = {0};
        userinput[0] = '\0';

        scanf("%100s", userinput);

        if (userinput[0] == '#')
        {
            break;
        }
        insertnum[count] = strtof(userinput, nullptr);
        count++;
    }
    return 0;
}

此外,您忘记初始化count。您的代码也将#插入到数组中。因此,我为您修复了该问题。

此外-我永远不会忘记我的计算机科学教授热情地向全班大喊关于从输入中“读取数字”的危险的那天。用户使用键盘上的数字而不是数字 。因此,“验证输入”一直困扰着我。您可能想考虑的是,只要用户键入非数字的内容,就让循环中断。循环的修改版本如下:

for (a = 0; a < maximum; a++) {
    char userinput[101] = {0};
    userinput[0] = '\0';
    scanf("%100s", userinput);
    char* endptr = NULL;

    float f = strtof(userinput, &endptr);
    if (userinput == endptr)
    {
        // whatever was typed was not a float
        break;
    }
    insertnum[count] = f;
    count++;
}

答案 1 :(得分:1)

检查scanf的返回值-成功转换float时,它将返回1(或更普遍地说,格式字符串中的许多转换成功了)。因此,当输入为#时,它将返回0(不进行任何转换),并将#留在输入流中。然后,您可以检查下一个字符以确保其为#。因此,您最终会遇到如下循环:

for (a=0; a<maximum && scanf("%f",&insertnum[a]) == 1; a++) {
    ++count;
}

甚至

for (count=0; count < maximum && scanf("%f",&insertnum[count]) == 1; ++count);
if (count == maximum) {
    // read the limit -- may be more data
} else {
    if (getchar() == '#') {
        // got the expected terminator
    } else {
        // something else caused a problem