【问题标题】:C program to find average, what is wrong in code?C程序查找平均值,代码有什么问题?
【发布时间】:2013-10-08 14:53:35
【问题描述】:
#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;
}

上面的程序是求用户给出的数字的平均值。该程序没有错误。我的代码有这些问题:

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

谁能告诉它有什么问题?我尝试用 getline() 替换代码的gets(),但输出时出现“Segmention Fault”错误。

【问题讨论】:

  • 第一次迭代后strtok的第一个参数必须为NULL。
  • 检查this code
  • 注意:推荐fgets(buf, sizeof buf, stdin)而不是fgets(buf, 255, stdin)。 1:这里应该传递 256 而不是 255,fgets() 知道只存储 255 个字符,然后是 \0。 2:最好使用sizeof buf而不是256,所以当缓冲区大小发生变化时,你在代码中只有1个地方需要更新。

标签: c average


【解决方案1】:

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

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

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

注意:由于strtok不能重入,你应该考虑切换到strtok_r

【讨论】:

  • @user2583127 您只需将token = strtok("", " ") 替换为token = strtok(NULL, " ")
  • 完成了这项工作,谢谢! :) 我还有 1 个问题,在第 7 行,我可以将 buf 的限制分配给无限吗?如果是,那怎么办?
  • @user2583127 不,您不能分配超出分配的限制。你可以分配更多,更多,但仍然会有限制,因为 C 库不支持缓冲区的自动重新分配。
【解决方案2】:

代码需要修改如下:

而不是 令牌 = strtok("", "");

使用如下: 令牌 = strtok(NULL, " ");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    相关资源
    最近更新 更多