【问题标题】:how do i print an int array of unknown size in c?如何在c中打印一个未知大小的int数组?
【发布时间】:2021-08-18 06:14:10
【问题描述】:

我想知道如何在 C(不是 C++)中打印一个未知大小的 int 数组。我不知道用户输入的数量,但我知道最多是1000。用户输入了一堆整数。我需要打印出具有偶数位置的整数。我的计划是将具有偶数位置的整数存储在 int 数组中并打印出来。但我被困住了,因为我不知道大小。帮助将不胜感激。谢谢。

【问题讨论】:

  • 用户如何输入数字?插入数组时计数。
  • 如果你只有一个 int* 你不能提取任何长度。您必须将长度存储在其他地方。
  • 您要么需要知道元素的数量,要么有一个标记结束的标记值(如字符串中的尾随 0 字节)。
  • 讲师是否要求您为此使用数组,因为问题实际上并不需要数组。您可以在输入每个整数后即时打印出所有其他整数。
  • 在现实生活中:您如何将未知尺寸的物体放入您的车中?在打印未知文档之前,您在打印机中放入了多少张纸?你试着提前找出尺寸。

标签: arrays c integer size


【解决方案1】:

对于静态分配的数组,您可以将总大小(以字节为单位)除以一个元素的大小(以字节为单位):

int array[512];
size_t arraySize = sizeof(array) / sizeof(*array) // = 512

对于动态分配的数组,您必须手动跟踪大小。这意味着,在创建数组时存储大小并在重新分配数组时更新该值。

从问题和 cmets 中,我了解到您想从 stdin 读取整数(我想直到 EOF)。有几种方法可以做到这一点:

1.分配一个最大大小的数组并打印每个其他元素

int array[1000];
size_t size = 0;
while (scanf("%d", &array[size]) != EOF)
    ++size;

for (size_t idx = 0; idx < size; idx += 2)
    printf("%d\n", array[idx]);

2。分配最大大小的一半并存储每隔一个元素

由于并非所有元素都在输出中使用,我们不妨只存储我们需要的元素。在scanf 格式说明符中使用* 丢弃第二个整数。

int array[500];
size_t size = 0;
while (scanf("%d%*d", &array[size]) != EOF)
    ++size;

for (size_t idx = 0; idx < size; ++idx)
    printf("%d\n", array[idx]);

3.分配最小内存量

每次我们需要存储另一个整数时,我们将数组的大小增加 1。这样可以节省空间,但速度不是很快。

int *array = NULL;
size_t size = 0;
int n;
while (scanf("%d%*d", &n) != EOF)
{
    array = realloc(array, ++size * sizeof *array);
    array[size - 1] = n;
}

for (size_t idx = 0; idx < size; ++idx)
    printf("%d\n", array[idx]);

free(array);

4.根本不存储数组

注意到输出并不依赖于读取整个数组,我们不妨打印每两个整数中的第一个。如果程序是交互式的(即用户在程序运行时键入整数),这在终端中看起来不会很漂亮,但如果它从stdin 接收输入,则可以正常工作。

int n;
while (scanf("%d%*d", &n) != EOF)
    printf("%d\n", n);

对于所有代码,关于使用scanf 和检查realloc 的返回值的常见警告都适用。

【讨论】:

    猜你喜欢
    • 2016-06-26
    • 2011-08-22
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2021-05-12
    • 1970-01-01
    相关资源
    最近更新 更多