【问题标题】:Storing integers as an array by reading size of array and the elemnts of the array in a single line通过在一行中读取数组的大小和数组的元素将整数存储为数组
【发布时间】:2016-04-30 04:41:33
【问题描述】:

我正在尝试从用户输入的整数创建一个数组。它们必须在同一行输入,例如5 1 2 3 1 6.整数的个数可以是任意数量。

但是,第一个数字 + 1 决定了数组的大小。例如。如果用户首先输入数字 5,则它后面必须跟着 5 个其他随机整数,从而使数组的长度为 6。我对如何执行此操作感到困惑,因为用户输入太多。提前致谢!

到目前为止,这是我的代码,但我认为它不会有太大帮助:

#include <stdio.h>

int main(void) {
    int arr_days[13];
    int i = 0;
    printf(" ");
    while(i < 13) {
        scanf("%d", &arr_days[i]);
        i = i + 1;
    }
    printf("%d", arr_days[0]);
    return 0;
}

【问题讨论】:

  • 对不起,我只是在编辑它
  • 请提出具体问题。您需要帮助的代码是什么?它在哪些方面没有做你想做的事?
  • 我要问的问题是如何根据用户输入的第一个数字来确定数组的长度?例如如果用户输入 5 2 5 314 135 123,我如何使数组长度为 6?
  • scanf读取第一个数字。然后声明一个可变长度数组 (VLA) 或使用malloc 动态分配数组。我会推荐后者。
  • 那是基本的C。如果你不知道那意味着你根本没有花时间自学C。 Stackoverflow 不是学习基本 C 的最佳场所。请查阅任何 C 书籍或教程 - 有很多。

标签: c arrays xcode integer user-input


【解决方案1】:

您并没有走得太远,您只需要动态分配缓冲区并分别读取第一个数字,以便您知道要执行多少空间和多少循环。

您可能还想在 malloc 之后检查 arr_days 是否为 NULL,以防止出现“内存不足”问题。

#include <stdio.h>

int main(void) {
    int* arr_days;
    int i = 0;
    int n;
    printf(" ");
    // get first number to find out how many more to expect
    scanf("%d", &n);
    // create memory space to store them
    arr_days = malloc(n * sizeof(int));
    while(i < n) {
        scanf("%d", &arr_days[i]);
        i = i + 1;
    }
    printf("%d", arr_days[0]);
    return 0;
}

编辑:我从一些更远的 cmets 看到,关于 scanf 存在一些混淆。如果没有待处理的输入,此命令将触发输入请求,然后它将处理任何待处理的输入。因此,当您输入一堆数字以响应 scanf 输入提示(或将带有这些数字的文本文件通过管道传输到程序中)时,每次调用 scanf("%d",...) 只会提取下一个整数,剩下的输入仍然可用。如果您认为它就像字符串是一个文件,那么 scanf 正在从该文件中读取并将文件指针留在它刚刚读取的位的末尾,为下一次调用以读取下一位做好准备......(这正是如果您通过管道传输文本文件,就会发生这种情况!)

【讨论】:

  • 好吧,有道理,我之前对malloc函数不熟悉,谢谢!
【解决方案2】:

首先,您需要获取数字,以便知道要读取多少数字以及分配数组的大小。

int num;
scanf("%d", &num);

int *arr = malloc(num * sizeof(int));

其次,一个一个地读出每个数字。

int I;
for (I = 0; I < num; I++) {
    scanf("%d", &arr[I]);
}

这显示了如何执行任务的示例,您需要注意检查scanf 的结果以确保输入成功,并检查malloc 以进行分配。

【讨论】:

  • OP 没有提到任何关于排序的内容...您是在回答另一个问题还是在同一个班级? :)
  • 很好@PeteB 我看到的是“排序”而不是“存储”,我的眼睛在下降。 ;-)
  • 但是如果它们都必须在同一行输入,那怎么可能呢?如果您说的 num 整数与其余的整数在同一行,如何逐个读取每个数字??
  • @RRrMmm scanf 会解决这个问题。
  • 但是你已经写了两个scanf语句,那是不是意味着它会在两行?
【解决方案3】:

如果要根据输入设置数组大小,则必须先读取输入。您想要输入一行中的所有数字(包括数组的大小),这意味着仅在行尾之后读取数字(按 [Enter] 后)。这种情况不可能使用静态数组

您无法读取所有输入,即要放入同一行的数组大小和整数并构建静态数组。但是您可以通过实现一个动态数组并将所有输入放在同一行中来构建一个动态数组

动态数组是一个可调整大小的数组或数组列表,具有随机 访问,可变大小的列表数据结构,允许元素是 添加或删除。

静态数组需要创建数组的大小,所以 可以在添加数组元素之前分配该内存 给它。

说了这么多, 如果您的数组大小具有上限大小(即设置了您可以接受的最大元素数量),那么您可以创建一个最大大小的静态数组并将您的输入读入其中。

int arr[MAX_ARRAY_SIZE ASSUMED];

这会分配一个大小为MAX_SIZE_ASSUMED 的数组,这意味着您的所有输入都可能存储在静态数组中。但是这是一种不好的实现方式,因为MAX_SIZE_ASSUMED 始终是数组的大小,即使您可能只在数组中输入一个元素。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多