用户输入数组大小C

时间:2017-04-18 04:42:16

标签: c arrays

编写一个程序,要求用户输入数组大小为“n”的值,并用n个整数填充数组。然后反转阵列并将其打印在屏幕上。 我正在使用Visual Studio,到目前为止: 我在“int arr1 [size]”中遇到“大小”问题。它说它必须是一个恒定的值。

#include <stdio.h>
int main(void)
{
int size, i;
printf("Enter the size of the arrays:\n");
scanf("%d", &size);

int arr1[size];
printf("Enter the elements of the array:\n");
for (i = 0; i < size; i++) {
    scanf_s("%d", arr1[size]);
}
printf("The current array is:\n %d", arr1[i]);
}

3 个答案:

答案 0 :(得分:1)

您无法使用静态内存分配来分配具有动态大小的阵列。您需要通过操作系统动态请求将内存分配给您的程序,无论用户要求的动态大小如何。

这是一个开始的例子:

#include <stdlib.h>
#include <stdio.h>

void printArray(int *array, int size) {
    // Sample array: [1, 2, 3, 4, 5]
    printf("["); // [
    for (int i = 0; i < size - 1; i++) { // [1, 2, 3, 4, 
        printf("%i, ", array[i]);
    }
    if (size >= 1) printf("%i", array[size-1]); // [1, 2, 3, 4, 5
    printf("]\n"); // [1, 2, 3, 4, 5]
}

int main(void) {
    int count;
    printf("Enter the size of the array:\n");
    scanf("%d", &count);

    // ask for enough memory to fit `count` elements,
    // each having the size of an `int`
    int *array = malloc(count * sizeof(*array));
    if (!array) {
        printf("There was a problem with malloc.");
        exit(EXIT_FAILURE);
    }

    printf("Enter the elements of the array:\n");
    for (int i = 0; i < count; i++) scanf("%d", &array[i]);

    printArray(array, count);

    //do stuff

    free(array);
}

答案 1 :(得分:1)

C的某些方言有variable-length arrays(VLA),特别是C99(而GCC接受them ....)

但是你的老师可能希望你理解C dynamic memory allocation,你也应该在scanf fails时进行测试,这样你就可以编码:

int main(void) {
    int size, i;
    printf("Enter the size of the arrays:\n");
    if (scanf("%d", &size)<1) {
      perror("scan size");
      exit(EXIT_FAILURE);
    };

实际上,您最好对size为负面的情况进行测试!我把它留给你。

    int *arr1 = calloc(size, sizeof(int));
    if (arr1==NULL) {
       perror("calloc arr1");
       exit(EXIT_FAILURE);
    }

您始终需要处理callocmalloc

的失败
 printf("Enter the elements of the array:\n");
 for (i = 0; i < size; i++) {
    if(scanf("%d", &arr1[size])<1) {
      perror("scanf arr1[size]");
      exit(EXIT_FAILURE);
    }
 }

scanf_s is仅存在于C11中,并且符合C11标准的实施,您可以使用VLA s

我把剩下的留给你了。您希望编写for循环来打印数组的每个元素。

当然你应该致电free appropriately(我要把它留给你)。否则,你有一个memory leak。有些系统有valgrind来帮助搜寻它们。不要忘记编译所有警告&amp;调试信息(GCC使用gcc -Wall -g)然后使用调试器(例如gdb)。

不要忘记编程语言是规范(在某些文档中编写),而不是软件。您可能想要浏览n1570。你需要了解undefined behavior的含义。

答案 2 :(得分:0)

在C中,无法以这种方式使用用户定义的大小定义数组。

方式不正确:

int size, i;
printf("Enter the size of the arrays:\n");
scanf("%d", &size);   
int arr1[size];

正确方式:

int size ;
int *arr1 ;
printf("Enter the size of the arrays:\n");
scanf("%d", &size);  
 arr1 = (int *) malloc(sizeof(int) * size);