【发布时间】:2016-10-22 14:11:38
【问题描述】:
我需要使用scanf 函数读取用户输入的未知数量的各种数字。这仅仅意味着各种整数的数量由用户通过发送尽可能多的数字来确定。请注意,我直接读取数字(我必须),如以下代码所述:
int main(void)
{
int numbers[];
int error = 0;
int i = 0;
while(scanf("%i", &numbers[i++]) == 1);
for(int i = 0; i < sizeof(numbers) - 1; ++i) {
if(numbers[i] < -10000 || numbers[i] > 10000)
{
printf("%i%s", numbers[i], ", ");
}
else
{
printf("%s", "\b\b\nError: Error: Vstup je mimo interval!\n");
// Means "Input is out of range!".
// We have to write exact output to terminal as stated in HW.
i = sizeof(numbers);
error = 1;
}
}
...
}
int error实际上是一个布尔值,但是我懒得实现布尔库,所以我将它定义为整数:D
但是,问题出在其他地方。编译器给我一个错误:
main.c:7:9: error: array size missing in ‘numbers’
int numbers[];
^
看起来 C 程序需要知道数组的可分配大小。我已经查看了其他人在那里共享的一些代码,以找出我需要实现的基础知识,在搜索数组大小问题时,我发现了这个问题:
C - Declaring an array with an undefined value
但是,对于直接输入未知数量的数字,它并不能解决数组大小未知的问题。我没有找到我需要解决的地方。我试图定义数组的最大大小以容纳最多 999 个数字,但是编译器向我抛出了这个异常:
main.c:50:23: error: iteration 999u invokes undefined behavior [-Werror=aggressive-loop-optimizations]
if(numbers[j] > 0)
^
main.c:48:9: note: containing loop
for(int j = 0; j < sizeof(numbers); ++j)
^
用于数字统计的每个循环都相同(总数、最大值、最小值、赔率、偶数、正数、负数、它们的百分比和平均值)。这意味着该数组的大小严格为 999 个数字,其余数字为零。我发现了一个malloc 函数,但不明白它的用法:(
【问题讨论】:
-
另外,C99 在
stdbool.h中提供了布尔类型_Bool。 -
@JohnBode:严格来说,C99 提供了
_Bool类型,即使没有<stdbool.h>标头;标头提供bool、true、false(和__bool_true_false_are_defined)。但您的主要观点是 C99 支持布尔类型,这是正确的。 -
请注意,
sizeof()返回一个以字节为单位的大小。如果它适用于您的数组(如果您的数组定义有效),那么or(int j = 0; j < sizeof(numbers); ++j)将尝试将sizeof(int)索引到数组中的时间太远。如果您显示第二批代码会更好,但您似乎定义了int numbers[999];只能使用值 0..998 进行索引,但如果sizeof(int) == 4(最常见的大小),那么您的循环会尝试索引元素 999 .. 3995,但数组中都不存在这些元素。因此编译器警告。 -
C 中没有机制可以在单个 I/O 操作中读取不定数量的整数。您必须提前知道该数字,或者一次迭代读取一些适当的较小数字集(例如,一次一个)。您可以编写一个函数来完成这项工作。除了 EOF 之外,还应该如何检测输入的结尾?有几种方法可以告诉您何时需要退出循环:EOF、非数字输入、先前计数——我错过了吗?我想,哨兵值(例如 -999999)是“非数字输入”的变体——它是数字但具有特殊含义。
-
这正是动态分配的用途,在 C 中,您使用
malloc()(或calloc())来执行动态分配。你能解释一下你对malloc()的不理解吗?
标签: c arrays compiler-errors