如何根据c中的用户输入扩展数组
how to expand an array based on user input in c
我正在尝试编写一个程序,询问用户数组的大小,如果再次询问他们,则数组的大小将根据他们输入的数字增加。
int main()
{
int size;
int n;
printf("Size of array: ");
scanf("%d", &n);
int *ptr = (int*)malloc(n*sizeof(int));
size = n;
int n1;
do {
printf("Input the increase size of the array: ");
scanf("%d", &n1);
size += n1;
int *ptr = realloc((size)*sizeof(int));
} while (n1 != -1);
return 0;
}
这是我得到的,但我怎样才能将它移动到一个函数中
- 您必须包含相应的 headers 才能使用标准库。
- 您必须传递旧指针才能重新分配给
realloc()
。
- 您必须为指针变量指定另一个名称才能获得
realloc()
的 return 值,而不是遮蔽(隐藏)变量以存储指向数组的指针。
- 您应该检查
malloc()
和 realloc()
的 return 值(以及 scanf()
以检查它们是否成功。
malloc()
家族的选角结果是 considered as a bad practice。
固定码:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int size;
int n;
printf("Size of array: ");
if (scanf("%d", &n) != 1) return 1;
int *ptr = malloc(n*sizeof(int));
if (ptr == NULL) return 1;
size = n;
int n1;
do {
printf("Input the increase size of the array: ");
if (scanf("%d", &n1) != 1) return 1;
size += n1;
int *new_ptr = realloc(ptr, (size)*sizeof(int));
if (new_ptr == NULL) return 1;
ptr = new_ptr;
} while (n1 != -1);
return 0;
}
对于初学者来说,调用函数 realloc
int *ptr = realloc((size)*sizeof(int));
不正确。该函数需要两个参数。
如果你想编写一个函数来改变动态分配数组的大小,那么它可以像下面这样
int resize( int **a, size_t n )
{
int *tmp = realloc( *a, n * sizeof( int ) );
if ( tmp != NULL ) *a = tmp;
return tmp != NULL;
}
并且函数可以被调用,例如
do {
n1 = -1;
printf("Input the increase size of the array: ");
scanf("%d", &n1);
} while ( n1 != -1 && resize( &ptr, size += n1 ) );
if ( scanf( "%d", &n1 ) == 1 )
{
int *tmp = realloc( ptr, (size + n1) * sizeof *ptr );
if ( tmp )
{
ptr = tmp;
size += n1;
}
}
如果realloc
不能满足请求,它将returnNULL
并保留原来的缓冲区;如果您将结果分配回 ptr
,您将 运行 失去对该内存的唯一引用的风险。因此,最好将结果分配给一个临时指针值,并确保在更新 ptr
.
之前它不是 NULL
此外,在您知道 realloc
成功之前,您不想更新尺码。
将其放入函数中:
bool resize( int **ptr, int *size )
{
int n1;
bool success = false;
printf( "Increase the size by: " );
if ( scanf( "%d", &n1 ) == 1 )
{
int *tmp = realloc( *ptr, (*size + n1) * sizeof **ptr );
if ( tmp )
{
*ptr = tmp;
*size += n1;
success = true;
}
else
{
fputs( "realloc could not extend the buffer\n", stderr );
}
}
else
{
fputs( "Error or bad value on input\n", stderr );
}
return success;
}
你会称它为
int main( void )
{
int size = 0;
int *ptr = NULL;
...
if ( resize( &ptr, &size ) )
// do stuff with ptr
else
// handle resize error
如果你只想将内存分配移动到一个函数中,你可以这样做:
int *allocate_array(int *ptr,size_t siz)
{
return realloc(ptr,size * sizeof(int));
}
int main()
{
int n, n1, size, *ptr = NULL;
printf("Size of array: ");
scanf("%d",&n);
ptr = allocate_array(ptr,n);
size = n;
do {
printf("Input the increase in the array size: ");
scanf("%d",&n1);
size += n1;
ptr = allocate_array(ptr,size);
} while (n1 > 0);
return 0;
}
请注意,您对 realloc
的调用不正确,因为第一个参数必须是指向现有数组的指针。此外,您创建了一个新的 ptr
,其范围只是 while 循环,然后在循环之外不再存在。
可以使用realloc函数重新分配内存
void *realloc(void *ptr, size_t 大小);
我正在尝试编写一个程序,询问用户数组的大小,如果再次询问他们,则数组的大小将根据他们输入的数字增加。
int main()
{
int size;
int n;
printf("Size of array: ");
scanf("%d", &n);
int *ptr = (int*)malloc(n*sizeof(int));
size = n;
int n1;
do {
printf("Input the increase size of the array: ");
scanf("%d", &n1);
size += n1;
int *ptr = realloc((size)*sizeof(int));
} while (n1 != -1);
return 0;
}
这是我得到的,但我怎样才能将它移动到一个函数中
- 您必须包含相应的 headers 才能使用标准库。
- 您必须传递旧指针才能重新分配给
realloc()
。 - 您必须为指针变量指定另一个名称才能获得
realloc()
的 return 值,而不是遮蔽(隐藏)变量以存储指向数组的指针。 - 您应该检查
malloc()
和realloc()
的 return 值(以及scanf()
以检查它们是否成功。 malloc()
家族的选角结果是 considered as a bad practice。
固定码:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int size;
int n;
printf("Size of array: ");
if (scanf("%d", &n) != 1) return 1;
int *ptr = malloc(n*sizeof(int));
if (ptr == NULL) return 1;
size = n;
int n1;
do {
printf("Input the increase size of the array: ");
if (scanf("%d", &n1) != 1) return 1;
size += n1;
int *new_ptr = realloc(ptr, (size)*sizeof(int));
if (new_ptr == NULL) return 1;
ptr = new_ptr;
} while (n1 != -1);
return 0;
}
对于初学者来说,调用函数 realloc
int *ptr = realloc((size)*sizeof(int));
不正确。该函数需要两个参数。
如果你想编写一个函数来改变动态分配数组的大小,那么它可以像下面这样
int resize( int **a, size_t n )
{
int *tmp = realloc( *a, n * sizeof( int ) );
if ( tmp != NULL ) *a = tmp;
return tmp != NULL;
}
并且函数可以被调用,例如
do {
n1 = -1;
printf("Input the increase size of the array: ");
scanf("%d", &n1);
} while ( n1 != -1 && resize( &ptr, size += n1 ) );
if ( scanf( "%d", &n1 ) == 1 )
{
int *tmp = realloc( ptr, (size + n1) * sizeof *ptr );
if ( tmp )
{
ptr = tmp;
size += n1;
}
}
如果realloc
不能满足请求,它将returnNULL
并保留原来的缓冲区;如果您将结果分配回 ptr
,您将 运行 失去对该内存的唯一引用的风险。因此,最好将结果分配给一个临时指针值,并确保在更新 ptr
.
NULL
此外,在您知道 realloc
成功之前,您不想更新尺码。
将其放入函数中:
bool resize( int **ptr, int *size )
{
int n1;
bool success = false;
printf( "Increase the size by: " );
if ( scanf( "%d", &n1 ) == 1 )
{
int *tmp = realloc( *ptr, (*size + n1) * sizeof **ptr );
if ( tmp )
{
*ptr = tmp;
*size += n1;
success = true;
}
else
{
fputs( "realloc could not extend the buffer\n", stderr );
}
}
else
{
fputs( "Error or bad value on input\n", stderr );
}
return success;
}
你会称它为
int main( void )
{
int size = 0;
int *ptr = NULL;
...
if ( resize( &ptr, &size ) )
// do stuff with ptr
else
// handle resize error
如果你只想将内存分配移动到一个函数中,你可以这样做:
int *allocate_array(int *ptr,size_t siz)
{
return realloc(ptr,size * sizeof(int));
}
int main()
{
int n, n1, size, *ptr = NULL;
printf("Size of array: ");
scanf("%d",&n);
ptr = allocate_array(ptr,n);
size = n;
do {
printf("Input the increase in the array size: ");
scanf("%d",&n1);
size += n1;
ptr = allocate_array(ptr,size);
} while (n1 > 0);
return 0;
}
请注意,您对 realloc
的调用不正确,因为第一个参数必须是指向现有数组的指针。此外,您创建了一个新的 ptr
,其范围只是 while 循环,然后在循环之外不再存在。
可以使用realloc函数重新分配内存
void *realloc(void *ptr, size_t 大小);