当我输入一个字母时,我的函数可以工作,但是当我输入一个整数时它不会
Posted
技术标签:
【中文标题】当我输入一个字母时,我的函数可以工作,但是当我输入一个整数时它不会【英文标题】: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 < Size && scanf("%d", arr + i) == 1; i += 1) ...
。 (假设您修复了 arr
的初始化,如其他 cmets 中所述)。不需要getchar
; %d
转换说明符将使用前导空格。
【参考方案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 编程,你真的必须了解这些概念。如果这对您来说太多了,请选择另一种为您处理内存的语言。
【讨论】:
以上是关于当我输入一个字母时,我的函数可以工作,但是当我输入一个整数时它不会的主要内容,如果未能解决你的问题,请参考以下文章