通过在一行中读取数组大小和数组元素,将整数存储为数组

时间:2016-04-30 04:41:33

标签: c arrays xcode integer user-input

我正在尝试从用户输入的整数创建一个数组。它们必须在同一条线上输入,例如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;
}

3 个答案:

答案 0 :(得分:0)

你不是太遥远,你只需要动态分配缓冲区并分别读取第一个数字,这样你就可以知道要执行多少空间和多少循环。

您可能还想在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;
}

编辑:我从一些评论中进一步了解到,对于scanf存在一些困惑。如果没有输入挂起,此命令将触发输入请求,然后它将处理任何挂起的输入。因此,当您输入一堆数字以响应scanf输入提示(或将具有这些数字的文本文件传输到程序中)时,每次调用scanf(“%d”,...)将仅提取下一个整数,其余输入仍然可用。如果你认为它就像字符串是一个文件,scanf正在读取该文件,并将文件指针留在它刚刚读取的位的末尾,准备下一次调用以读取下一位...(这正是管道文本文件时会发生!)

答案 1 :(得分:0)

首先,您需要获取该数字,以便了解要读取的数量和分配数组的大小。

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是否也有分配。

答案 2 :(得分:0)

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

您无法读取所有输入,即阵列大小和数据。将整数放在同一条线上并将其放入构建一个静态数组。但你可以通过实现动态数组并将所有输入放在同一行中来构建动态数组

  

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

     

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

所有这一切都说,  如果你的数组大小有一个上限大小(即你可以接受的最大元素数),那么你可以创建一个最大大小的静态数组并读入你的输入。

int arr[MAX_ARRAY_SIZE ASSUMED];

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