C 为什么我不退出这个while循环?

C 为什么我不退出这个while循环?,c,while-loop,C,While Loop,我正试着做一个小程序来计算标准偏差以供实践。我的问题似乎是主函数中的第一个while语句 我对此有点生疏,我不明白为什么在用户点击enter后不留下while语句 别介意我的绿色。还在学习 #include <stdio.h> #include <math.h> #define arraySize 100 double standardDeviation(int, double*); int main(void){ double array[arraySize];

我正试着做一个小程序来计算标准偏差以供实践。我的问题似乎是主函数中的第一个
while
语句

我对此有点生疏,我不明白为什么在用户点击enter后不留下while语句

别介意我的绿色。还在学习

#include <stdio.h>
#include <math.h>
#define arraySize 100
double standardDeviation(int, double*);
int main(void){
    double array[arraySize];
    double result;
    int i=0;
    int count=0;
    printf("Enter up to %d data separated by spaces then hit enter:\n\n",arraySize);
    while(i<arraySize && array[i]!='\n'){
        scanf("%lf",&array[i]);
            i++;
            count++;
            }

    result=standardDeviation(count, array);

    printf("The standard deviation of your data is: %lf",result);

    return 0;
}

double standardDeviation(int count, double* firstDatum){
    int i=0,j=0;
    double standDev=0;
    double standDevArray[arraySize];
    double sum=0,sum2=0;
    double mean=0,variance=0;
    while(i<count){
        sum=sum + firstDatum[i]; 
        //printf("%lf", sum);
        i++;
    }
    mean=sum/count;
    //printf("The mean is: %lf", mean);

    while(j<count){
           standDevArray[j] = (mean  - firstDatum[j]) * (mean - firstDatum[j]);
           sum2=sum2+standDevArray[j];
           j++;
    }   
    variance=sum2/count;
    standDev=sqrt(variance);
    return standDev;
 }
#包括
#包括
#定义数组化100
双标准差(int,double*);
内部主(空){
双阵列[阵列化];
双重结果;
int i=0;
整数计数=0;
printf(“输入最多%d个由空格分隔的数据,然后点击回车键:\n\n”,arraySize);

虽然(i2个错误出现在这段代码中,但其中一个错误会导致未定义的行为

首先,将double(数组[i])与char('\n')进行比较


第二个是索引“i”。在while循环中,首先扫描并分配数组的第i个元素,然后在下一次迭代中,使用操作
i++
e将数组中未初始化的第i个元素与某个元素进行比较。请注意,在比较时,您的索引已经增加,并且不分配任何内容g到该元素,这会导致未定义的行为

我对主函数进行了以下调整。我只是根据用户输入预先确定了数据条目的数量,它工作正常。 知道我的函数在它的 第一次打电话给我,给了我标准偏差的正确值

但知道我不得不向用户询问条目数量有点令人不安。 我认为这个程序会更方便用户 如果我可以输入数据,然后在到达列表末尾时终止。尤其是对于较大的数据集,人们不知道他们输入了多少数据。使用带有终止值超出范围选项的数组有点困难,因为限制条目的值也会限制func的功能你认为如果有人想制作这样的程序,链表会更适合吗

#include <stdio.h>
#include <math.h>
#define arraySize 100
double standardDeviation(int, double);
int main(void){
    double array[arraySize];
    double result;
    int userSize;
    int i=0;
    int count=0;
    printf("Enter how many data will be entered up to a maximum of %d\n\n",arraySize);
    scanf("%d",&userSize);
    printf("Enter your data:\n\n");
        while(i<userSize && i<arraySize){
        scanf("%lf",&array[i]);
            i++;
            count++;
            }


    result=standardDeviation(count, array);

    printf("The standard deviation of your data is: %lf",result);


    return 0;
}

    double standardDeviation(int count, double* firstDatum){
        int i=0,j=0;
        double standDev=0;
        double standDevArray[arraySize];
        double sum=0,sum2=0;
        double mean=0,variance=0;
        while(i<count){
            sum=sum + firstDatum[i]; 
            //printf("%lf", sum);
            i++;
        }
        mean=sum/count;
        //printf("The mean is: %lf", mean);

        while(j<count){
               standDevArray[j] = (mean  - firstDatum[j]) * (mean - firstDatum[j]);
               sum2=sum2+standDevArray[j];
               j++;
        }   
        variance=sum2/count;
        standDev=sqrt(variance);
        return standDev;
     }
#包括
#包括
#定义数组化100
双标准差(int,double);
内部主(空){
双阵列[阵列化];
双重结果;
int用户大小;
int i=0;
整数计数=0;
printf(“输入最多可输入%d的数据量\n\n”,arraySize);
scanf(“%d”、&userSize);
printf(“输入数据:\n\n”);

虽然(i没有理由要求用户输入条目数。您要求用户输入一行,您可以使用
fgets
(或POSIX
getline
)将输入行读入缓冲区,然后使用
strtod
(首选)将输入的数字转换为
双值,或使用
sscanf
和要读取的下一个值的偏移量

您使用
保护数组边界做得很好,而(i
)只需在执行有效转换时添加第二个条件即可。例如:

#define MAXC 2048
...
int main(void) {

    char buf[MAXC];                     /* buffer to hold line of input */
    double array[arraySize], result;    /* your array and result */
    int i = 0, offset = 0, used;        /* i, offset in buf, chars used */

    printf ("Enter up to %d data separated by spaces then hit enter:\n\n",
            arraySize);
    if (!fgets (buf, MAXC, stdin)) {    /* read/validate line of input */
        fputs ("(user canceled input)\n", stderr);
        return 1;
    }

    while (i < arraySize && /* while in bounds && valid conversion */
            sscanf (buf + offset, "%lf%n", &array[i], &used) == 1) {
        offset += used;     /* update offset with chars used in conversion */
        i++;                /* increment index */
    }

    result = standardDeviation (i, array);  /* compute/display result */

    printf ("The standard deviation of your data is: %lf\n",result);

    return 0;
}
请注意,
+=
运算符只是一个简写方便的运算符。您不必编写
sum=sum+firstDatum[i];
,只需编写
sum+=firstDatum[i];


如果您还有其他问题,请告诉我。

看看i的值,因此在与换行符比较时,数组[i]的值。
数组[i]
是一个
。虽然将其与
'\n'
进行比较并没有错,但这是奇怪和不寻常的-可能是写
13.0
而不是
'\n'
(但更可能的是,该测试是多余的。)此外,
i
的值超出了
数组中最后一个初始化项的值-您的代码中有未定义的行为(UB)。您应该检查
scanf()的结果
调用。用户按enter键不会终止循环,因为
%lf
格式跳过空白,包括换行符。如果键入13作为值,您可能(可能会)退出循环。在
scanf()
中检测换行符很困难。您必须进行字符输入(
%c
%s
%s
)[…]
)在程序的数据中换行。
同时(i@JonathanLeffler
'\n'
通常是10,而不是13。(
'\r'
通常是13。)比较
double
char
不会导致未定义的行为;因为
char
是一个整数类型,它被转换为
double
。是的,我解释得很糟糕。我的意思是程序通常会导致第二个错误导致未定义的行为。因此,对于第一个错误,尽管没有定义,“\n”是从不通过scanf读取double数组,因此我需要找到另一种方法从用户输入中退出循环?第二个错误,你是说我应该将i++更改为++i吗?为什么?我确实将i初始化为0。请看几行。@exnihilo一句俏皮话:
'\n'
的类型是
int
,而不是
char
。(这并不影响行为。)@KeithThompson——当然了;我太马虎了;)
double standardDeviation (int count, double *firstDatum)
{
    double  standDev = 0,
            sum = 0, sum2 = 0,
            mean= 0, variance = 0;

    for (int i = 0; i < count; i++)
        sum += firstDatum[i]; 

    mean = sum / count;

    for (int i = 0; i < count; i++)
        sum2 += (mean  - firstDatum[i]) * (mean - firstDatum[i]);

    variance = sum2 / count;
    standDev = sqrt(variance);

    return standDev;
}