C程序找平均值,代码有什么问题?

时间:2013-10-08 14:53:35

标签: c average

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void){
double sum = 0;
int ii = 0;
char buf[256], *token;
printf("Enter the numbers to average on a single line, separated by space and press enter when done\n");
fgets(buf, 255, stdin);
token = strtok(buf, " ");
while (token != NULL)
{
    sum += atof(token);
    ii++;
    token = strtok("", " ");    // Get next number
}
printf("Average is %lf", sum / (double)ii);
return 0;
}

上述程序是为了找到用户提供的大量数字。该程序没有错误。我在代码中遇到了这些问题:

当你运行它时,它会要求你输入nos。由您找到平均值的空格分隔。输入以空格分隔的数字时 - 例如,您输入了 - 9080 5749 4343 8509 9790,然后它将打印第一个数字作为答案(即9080)。 如果输入9497 795 88,则会打印“Average is 9497.00000000”。如果您输入27 59 05,则会打印“平均值为27.0000000”等等..

任何人都能说出它的错误吗?我试过用getline()替换代码的gets()但它在输出时给出了“Segmention Fault”错误。

2 个答案:

答案 0 :(得分:5)

问题在于您调用strtok的方式:

  

在第一次调用时,函数需要一个C字符串作为str的参数,其第一个字符用作扫描标记的起始位置。 在后续调用中,函数需要一个空指针,并在最后一个标记结束后立即使用该位置作为扫描的新起始位置。 (重点是我的)

您传递的是空字符串""而不是NULL,这就是为什么结果只包含用户输入的第一项。

注意:由于strtok不可重入,因此您应该考虑切换到strtok_r

答案 1 :(得分:1)

代码需要更改如下:

而不是 token = strtok(“”,“”);

使用如下: token = strtok(NULL,“”);