通过在一行中读取数组的大小和数组的元素来将整数存储为数组
Storing integers as an array by reading size of array and the elemnts of the array in a single line
我正在尝试根据用户输入的整数创建一个数组。它们必须在同一行输入,例如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;
}
你离得不远,你只需要动态分配缓冲区并单独读取第一个数字,这样你就知道要执行多少space和多少次循环。
您可能还想在 malloc 之后检查 arr_days 是否为 NULL 以防止出现 'out of memory' 问题。
#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 正在从该文件读取并将文件指针留在它刚刚读取的位的末尾,为下一次读取下一位的调用做好准备......(这正是如果您通过管道传输文本文件,就会发生这种情况!)
首先您需要获取数字,以便您知道要读取多少个数字以及分配数组的大小。
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
以进行分配也是。
如果要根据输入设置数组大小,则必须先读取输入。你想要的是在一行中输入所有数字(包括数组的大小),这意味着数字只会在行尾(按[Enter]后)读取。这种情况对于静态数组是不可能的。
您无法读取所有输入,即数组大小和要放在同一行中的整数并构建静态数组。但是您可以通过实现一个动态数组并将所有输入放在同一行来构建一个动态数组。
A dynamic array is a re-sizable array or array list with random
access, variable-size list data structure that allows elements to be
added or removed.
A static array required the size of the array to be created so
that that memory could be allocated before array elements can be added
to it.
综上所述,
如果您的数组大小有上限大小(即设置了您接受的最大元素数),那么您可以创建一个最大大小的静态数组并读取您的输入。
int arr[MAX_ARRAY_SIZE ASSUMED];
这会分配一个大小为 MAX_SIZE_ASSUMED
的数组,这意味着您的所有输入都可能存储在静态数组中。但是 这是一种糟糕的实现方式,因为 MAX_SIZE_ASSUMED
始终是数组的大小,即使您可能只向数组中输入一个元素也是如此。
我正在尝试根据用户输入的整数创建一个数组。它们必须在同一行输入,例如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;
}
你离得不远,你只需要动态分配缓冲区并单独读取第一个数字,这样你就知道要执行多少space和多少次循环。
您可能还想在 malloc 之后检查 arr_days 是否为 NULL 以防止出现 'out of memory' 问题。
#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 正在从该文件读取并将文件指针留在它刚刚读取的位的末尾,为下一次读取下一位的调用做好准备......(这正是如果您通过管道传输文本文件,就会发生这种情况!)
首先您需要获取数字,以便您知道要读取多少个数字以及分配数组的大小。
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
以进行分配也是。
如果要根据输入设置数组大小,则必须先读取输入。你想要的是在一行中输入所有数字(包括数组的大小),这意味着数字只会在行尾(按[Enter]后)读取。这种情况对于静态数组是不可能的。
您无法读取所有输入,即数组大小和要放在同一行中的整数并构建静态数组。但是您可以通过实现一个动态数组并将所有输入放在同一行来构建一个动态数组。
A dynamic array is a re-sizable array or array list with random access, variable-size list data structure that allows elements to be added or removed.
A static array required the size of the array to be created so that that memory could be allocated before array elements can be added to it.
综上所述, 如果您的数组大小有上限大小(即设置了您接受的最大元素数),那么您可以创建一个最大大小的静态数组并读取您的输入。
int arr[MAX_ARRAY_SIZE ASSUMED];
这会分配一个大小为 MAX_SIZE_ASSUMED
的数组,这意味着您的所有输入都可能存储在静态数组中。但是 这是一种糟糕的实现方式,因为 MAX_SIZE_ASSUMED
始终是数组的大小,即使您可能只向数组中输入一个元素也是如此。