加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

统计信息的动态输入

发布时间:2020-12-15 22:01:45 所属栏目:安全 来源:网络整理
导读:是否有类似于我用bash编写的实现的等效解决方案?通常,我总是像这样处理动态分配: (我喜欢第二个实现,因为它很灵活,我不需要知道我需要多少输入,我可以按原样输入它们.如何在C中实现类似的方法? C实施: double* get_data(int* data_size){ double* data_s
是否有类似于我用bash编写的实现的等效解决方案?通常,我总是像这样处理动态分配:

(我喜欢第二个实现,因为它很灵活,我不需要知道我需要多少输入,我可以按原样输入它们.如何在C中实现类似的方法?

C实施:

double* get_data(int* data_size)
{
    double* data_set = NULL;
    int size = get_size();
    int i;

    *data_size = size;

    data_set = malloc(size * sizeof(double));

    for(i = 0; i < size; i++) 
    {
        printf("Enter statistical data: ");
        scanf("%lf",&data_set[i]);
    }

    return data_set;
}

Bash实施:

data_set=()
while IFS= read -r -p 'Enter statistical data (empty line to quit):' input; do
  [[ $input ]] || break
  data_set+=("$input")
done

解决方法

最简单的解决方案是使用C.但那不是你要问的,所以我会留在那里.

以下,虽然看起来很糟糕,但实际上通常非常有效(取决于你的C库的realloc实现,但它是GNU代码中常见的习惯用法,所以realloc实现通常很适合它):

double* get_data(size_t *size_p) {
  size_t n = 0;
  double* data = NULL;
  double val;
  while (get_a_datum(&val)) {
    double* newdata = realloc(data,(n + 1) * sizeof *data);
    if (newdata == NULL) { free(data); report(error); }
    data = newdata;
    data[n++] = val;
  }
  if (size_p) *size_p = n;
  return data;
}

如果您对这种方法不满意,可以滚动自己的指数realloc,在其中跟踪分配的向量的大小,如果要超过它,则加倍.但是,这是更多的代码,而realloc很可能会为你做到这一点.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读