用户定义的数组元素和数组大小在C

时间:2018-01-30 18:04:20

标签: c arrays

我是C编程的新手,我自己学习。我想编写一个代码,要求用户输入一些数字并将它们存储到数组中。如果用户输入'q',程序将停止。然后它应该打印数组并告诉用户该数组中有多少个数字。 (长度)

我编写了以下代码,但是如果我将 int array []; 留空,它就不起作用(显然)。我无法定义它,因为它取决于用户输入的数量...我通过互联网搜索了很多并遇到了malloc和calloc。我试着在这里使用它们,但老实说我不知道​​如何,我现在坐在这段代码上几天了。

#include <stdio.h>
#include <stdlib.h>
int main()
{
int array[]; //I want to leave this empty but C doesn't allow me to.
int len=sizeof(array)/sizeof(array[0]);

for(int a=0;a<len;a++)
{
    printf("Enter element %d: ", a);
    scanf("%d",&array[a]);
    if(getchar()=='q')
        break;
}

printf("Array: [");
for(int a=0;a<len-1;a++)
{
    printf("%d, ", array[a]);
}   printf("%d]", array[len]);
printf("\nArray length: %d\n", len);
return 0;
}

int array [5]的示例输出;

Enter element 0: 1
Enter element 1: 2
Enter element 2: 3
Enter element 3: 4
Enter element 4: 5
Array: [1, 2, 3, 4, 5]
Array length: 5

非常感谢任何帮助。谢谢你,祝你有个愉快的一天。

3 个答案:

答案 0 :(得分:3)

Malloc和calloc函数允许您为变量动态分配内存。 我认为如果使用int指针(int*)而不是int [],它会更好。 你可以做这样的事情

int * array = malloc (sizeof(int)); //this will allocate enough memory for 1 int element
Len = 1;

然后在循环结束时,如果用户没有输入&#39; q&#39;你可以做这样的事情

len ++ ;
array = realloc(array,len*sizeof(int)); //this will reallocate memory for your int pointer

然后在代码结束时,你必须像这样调用函数:free(array);来释放分配的内存。

编辑:在for循环之后,您正在访问不应该在array[len]中的内存。 我认为您应该将其更改为array[len-1]

答案 1 :(得分:2)

正如你自己所说,我们的想法是分配一些元素,然后在其中存储元素。当它满了,然后重新分配并线性增加其大小。在处理结束时,您释放您没有使用的内存。

密切实施我所说的内容:

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <limits.h>
#include <stdlib.h>

#define MAXLEN 3
#define MAXBUFF 30
int main(void)
{
    size_t sz = 0,tsz=MAXLEN;
    int *arr= malloc(sizeof*arr*MAXLEN);
    if( !arr){
        perror("malloc:");
        exit(EXIT_FAILURE);
    }
    char s[MAXBUFF];
    while(fgets(s,MAXBUFF,stdin)!=NULL){
        if(strstr(s,"q") != NULL){
            break;
        }
        else{

            char *t;
            errno = 0;
            long n = strtol(s, &t, 10);
            if ((errno == ERANGE && (n == LONG_MAX || n == LONG_MIN))|| (errno != 0 && n == 0)) {
                perror("strtol");
                exit(EXIT_FAILURE);
            }
            if (t == s) {
                fprintf(stderr, "No digits were found\n");
                exit(EXIT_FAILURE);
            }
            if ( n >= INT_MIN && n <= INT_MAX)
            {
                arr[sz++]=(int)n;  
            }
            else{
               fprintf(stderr, "Too big/small a number\n");
               exit(EXIT_FAILURE); 
            }

        }
        if( sz == tsz){
            int *p = realloc(arr,sizeof *p*(tsz+MAXLEN));
            if(!p){
                perror("Realloc:");
                exit(EXIT_FAILURE);
            }
            arr = p;
            tsz+= MAXLEN;
        }
    }
    int *p = realloc(arr,sizeof *p*sz);
    if(!p){
        perror("Realloc:");
        exit(EXIT_FAILURE);
    }
    arr = p;
    printf("Numbers entered = %zu\n",sz );
    for(size_t i = 0; i< sz; i++)
        printf("a[%zu]=%d\n",i,arr[i] );
    free(arr);
    return(0);
}

在阅读此代码时,我建议查看手册页以了解每个函数返回的内容。最后realloc()基本上将内存缩小到适当的大小(如果分配的数量超过需要的话)。内存的增加是线性的(我们逐渐添加了size

答案 2 :(得分:0)

没有大小的数组只有在c99为你的问题发挥作用后才允许你可以利用malloc和realloc来动态定义数组的大小这里是程序的运行方式

#include <stdio.h>
#include <stdlib.h>
int main()
{
//Initially defining the size of our dynamic array=1
int *arr = malloc(1 * sizeof(int));
int counter=2;
while(1)
{
    printf("Enter element %d: ", a);
//reallocating array size after user enters a value
    arr = realloc(arr, counter * sizeof(int)); 
    counter++;

    scanf("%d",&arr[counter]);

    if(getchar()=='q')

     break;
}

printf("Array: [");
for(int a=0;a<counter-1;a++)
{
    printf("%d, ", array[a]);
}   printf("%d]", array[counter]);
printf("\nArray length: %d\n", counter);
return 0;
}

如果有帮助,请告诉我