假设我必须输入一个数组,但我不知道tha数组的大小。如果我知道该数组的大小,我可以这样做
for(i=0;i<n;i++)
scanf("%d",&arr[i]);
如果我知道n的值,可以这样做。如果我不知道n的值怎么办?我们如何输入数组?
我很想知道您是否正在使用用户界面,在这里您可以将数组大小作为输入,然后像对待事先知道数组大小一样正常进行。
一些示例代码供您遵循:-
int reqArraySize;
printf("Enter the array size: ");
scanf("%d", &reqArraySize);
此后,您可以继续使用此getget输入数组大小:
for(i=0;i<reqArraySize;i++)
scanf("%d",&arr[i]);
希望这对您有所帮助。
干杯。
如果您不知道run-time
或compile-time
处数组的大小,则应使用linked lists,或按照Jean-Claude在其评论中提到的,声明fixed-size array
使用dynamic memory allocation
或malloc()
之类的calloc()
函数,并在需要时使用realloc()
数组的大小。
您可以按照this question的答案来创建动态数组。它使用的结构包含数组,最大大小和已用大小。如果达到最大大小,将重新分配阵列,并增加最大大小。
这里是显示一种管理动态数组的方法的示例。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
/* To manage an array of varying size, we keep a pointer to the size of
the array and the number of elements in the array.
The pointer is initially null, and there are no elements in the array.
*/
int *Numbers = NULL;
size_t NumberOfAllocatedElements = 0;
/* We get numbers one by one, using TemporaryNumber to hold them. As long
as scanf reports it was able to read and assign 1 item, we continue
adding the number to the array.
*/
int TemporaryNumber;
while (1 == scanf("%d", &TemporaryNumber))
{
/* To grow the array, increase the number of allocated elements and
use realloc to request more space.
*/
int *NewNumbers =
realloc(Numbers, ++NumberOfAllocatedElements * sizeof *NewNumbers);
/* If realloc fails, we report an error and exit. A more
sophisticated program could do something else in this case.
*/
if (!NewNumbers)
{
fprintf(stderr, "Error, unable to allocate memory.\n");
exit(EXIT_FAILURE);
}
// Update our pointer with the new address.
Numbers = NewNumbers;
// Record the new element in the array.
Numbers[NumberOfAllocatedElements - 1] = TemporaryNumber;
}
// Show the contents of the array.
for (size_t i = 0; i < NumberOfAllocatedElements; ++i)
printf("Number %zu is %d.\n", i, Numbers[i]);
// Release the memory.
free(Numbers);
}
这很大程度上是一个初学者的例子。一种改进是一次分配大量内存,而不是每次仅分配一个元素。在这种情况下,程序需要跟踪有关数组的两个数字:分配的空间量和当前在其中使用的元素数。
也有多种选择。
这里是一个示例,说明了realloc的用法。请注意,在这里,为了限制重新分配的数量,新大小始终为2的幂。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void) {
int *a, i, j, n, k;
char input[10];
/* Start small */
n = 1;
a = malloc(n * sizeof(int));
/* Read an integer until the user types 'end' */
for (i = 0; ; i++) {
fgets(input, 10, stdin);
input[strcspn(input, "\r\n")] = 0;
if (!strcmp(input, "end")) {
break;
}
if (!sscanf(input, "%d", &k)) {
printf("Input error\n");
} else
/* Reallocate if the array is full */
if (i >= n) {
n *= 2;
a = realloc(a, n * sizeof(int));
printf("New size: %d\n", n);
}
a[i] = k;
}
/* Final reallocation to match the exact size */
a = realloc(a, i);
/* Do something with the array */
for (j = 0; j < i; j++) {
printf("%d ", a[j]);
}
printf("\n");
free(a);
return 0;
}