【问题标题】:How can I read data from an array if the array size is too large.....! [closed]如果数组大小太大,如何从数组中读取数据.....! [关闭]
【发布时间】:2017-07-06 13:23:35
【问题描述】:

如何仅读取包含以下数组中数据值的单元格。 sample array

这是我的代码作为示例,它显示值但它读取所有单元格以仅检索 4 个值。我怎样才能避免这个包含零的位置?。随机位置中可能有数据,其余位置将为零。有没有办法只读取包含单元格的数据值。

#include<stdio.h>
void main()
{
    int i,data[500000]={25,0,0,0,0,98,0,0,13,0,857};
    for(i=0;i<500000;i++)
    {
        if(data[i]==0)
            continue;
        printf("%d\t",data[i]);
    }
}

【问题讨论】:

  • 您的代码说不打印零。数组中只有四个非零值。你预计会发生什么?
  • 另外,当您只使用 11 个值进行初始化时,为什么还要使用 500000
  • 如果您需要一个包含 50 万个 int 值的数组,堆栈可能不是最适合它的地方。请改用malloc()calloc()
  • 用一个标记值填充数组,比如-1,当你点击它时,跳出你的循环。如果有效数字不允许哨兵值,那么您只需要跟踪您正在使用另一种方式的数组的多少。
  • 我希望支持这个问题的人能够解释它到底想问什么。

标签: c arrays algorithm data-structures


【解决方案1】:

啊,我想我现在明白这个问题了。我想您想知道如何在data[10] 之后停止阅读,因为尽管您已经分配了 50 万个条目,但现在还远未填充所有这些元素。

请注意,我们假设我们自己的“填充”含义。 C 没有空数组元素的概念。

在 C 中,将 size 变量与超大数组一起保存是很常见的。所以你可以做类似的事情:

int data[500000]={25,0,0,0,0,98,0,0,13,0,857};
int size = 11;
for(int i=0;i<size;i++) {
    if(data[i]==0) {
        continue;
    }
    printf("%d\t",data[i]);
}

(我已在您的 if 块中添加了大括号 - 不要养成省略它们的习惯)

你似乎想跳过零,我把它留在里面了。

添加元素时,需要增加尺寸。

data[size] = newValue;
size++;

... 或者更简洁的惯用 C ...

data[size++] = newValue;

...并且您需要确保无论您的数组如何工作,都可以看到长度。比如你不能有一个函数findHighest(int data[])—— 它必须是findHighest(int data[], int size。随着您在 C 学习中的进步,您会发现 struct 如何帮助您更巧妙地实现这一目标。

read 系统调用就是一个例子:

int length = read(file, buf, count);

buf 是一个长度为 count 的 char[]read() 将读取一些字节数,直到 count,并返回 lengthbuf[0]buf[length-1] 包含您要使用的字节。 buf[length] 以后是垃圾。


另一种方法是确保数组中的第一个不相关值包含一个标记值,表示“没有更多可看”。例如,您可以使用-1,如果您确定它永远不会是一个有效值。一个非常简单的方法是在初始化时用-1s 填充数组(使用memset())。或者,确保在延长长度时将标记值写入data[index_of_last_value + 1]

标准 C 字符串处理函数是使用标记的代码示例。 NULL(零,'\0')表示字符串的结尾,该字符串通常存储在较长的缓冲区中。

【讨论】:

    猜你喜欢
    • 2016-05-25
    • 2015-10-13
    • 2019-08-08
    • 1970-01-01
    • 2018-07-03
    • 2021-12-13
    • 2020-10-04
    • 2011-04-10
    • 1970-01-01
    相关资源
    最近更新 更多