【问题标题】:When I enter a letter, my function works but when I enter an integer it doesnt当我输入一个字母时,我的函数可以工作,但是当我输入一个整数时它不会
【发布时间】:2022-01-16 14:32:17
【问题描述】:

我正在尝试创建一个函数,该函数将要求用户输入一个数字以确定数组的大小,然后将数字输入到数组中。然后我需要打印数组并交换其中的最小和最大数字。这是C语言的


#include <stdio.h>

void read_array();
void display_array();

void read_array(int arr[])
{
    int Size;
    printf("Enter the desired size of the array: ");
    scanf("%d", &Size);
    
    for(int i = 0; i < Size; i++)
    {
        printf("\nEnter a number for position %d:", i);
        scanf("%d", &arr[i]);
        getchar();
    }
}

int main()
{
    int size;
    int arr[size];
    
    read_array(arr[size]);
    

    return 0;
}

【问题讨论】:

  • 当你在C中使用标签时,已经很清楚你在使用c,不需要用c语言编写这段代码,也不需要附加部分display_array()。
  • int size; int arr[size]; 无效 - 您正在使用未定义的长度定义可变长度数组。要么选择您的程序可以处理的最大数组大小,要么动态分配数组,或者在定义数组之前读取大小
  • 数组大小在创建时是固定的,您使用未初始化的可变大小创建它。代码read_array(arr[size]);也应该有编译错误,检查你的编译器消息。
  • 必须 始终检查scanf返回的值。在这种情况下,您可以使用for(int i = 0; i &lt; Size &amp;&amp; scanf("%d", arr + i) == 1; i += 1) { ... }。 (假设您修复了 arr 的初始化,如其他 cmets 中所述)。不需要getchar%d 转换说明符将使用前导空格。

标签: arrays c function


【解决方案1】:

关于数组的创建,您有 3 个选项(按我自己的喜好排序)。

在这个例子中,get_array_size() 是一个函数,它返回用户输入的元素数量,process_array() 对创建的数组做一些事情(比如用更多的用户输入填充它)。

1.) 使用固定长度数组

int array[10];
unsigned int size = get_array_size();

if (size > 10) {
    printf("Size is too large.\n");
    exit(1);
}

process_array(array, size);

这样做的好处是始终清楚您的程序将消耗多少内存:int 大小的 10 个元素。

显然,如果用户输入的数字小于10(在此示例中),则数组的其余部分将被“浪费”。

2.) 在堆上分配数组

unsigned int size = get_array_size();

// It's still advised to "cap" the max. size of your array
if (size > 32) {
    printf("Won't allocate: size is too large.\n");
    exit(1);
}

int *array;

array = calloc(size, sizeof(int));

if (!array) {
    printf("Could not allocate memory!\n")
    exit(1);
}

process_array(array, size);
free(array);

注意free()函数的使用。

这里只会分配需要/请求的内容(如果用户输入5,则只会分配5元素)。

缺点是一旦你完成分配的内存,你必须free()

即使在这里,仍然非常建议设置元素的最大数量(例如,您不希望您的程序为不需要要求的简单任务分配 4GB 内存> 它)

3.) 在栈上分配数组

unsigned int size = get_array_size();

// It's still advised to "cap" the max. size of your array
if (size > 32) {
    printf("Won't allocate: size is too large.\n");
    exit(1);
}

int array[size];

process_array(array, size);

除了你不用free() 使用后的内存之外,与选项2 相同。但是,其他限制也起作用(您不能从函数中返回这样分配的数组),并且您绝对不想溢出堆栈。

所以你看,无论你选择哪个选项:实际上总是需要强制执行最大值,所以我会尽可能选择第一个选项(考虑堆栈大小)。

在所有情况下,process_array 函数都可以以相同的方式实现(该函数不关心内存来自哪里):

void process_array(int *array, unsigned int size) {
     for (unsigned int i = 0; i < size; ++i) {
          // do something with array[i]
     }
}

底线是:如果你想用 C 编程,你真的必须了解这些概念。如果这对您来说太多了,请选择另一种为您处理内存的语言。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    相关资源
    最近更新 更多