是的,所以我有这个练习我应该完成:Exercise Specification
我很难确保数组中的数字与计数器匹配。主要问题是在最后一个计数器(49)上似乎有一个数字不在数组中。正如你在这里看到的: Output of current program
我对C编程很新,所以我可以肯定我做错了什么,我只是不确定是什么。另外,我如何添加星星以匹配规格上的彩票阵列。
以下是我的代码的当前状态:
int main()
{
//char star;
int i;
int lottery[49] = { 23,16,18,19,26,13,22, /* 1 .. 7 */
20,14,22,18,21,15,17, /* 8 .. 14 */
24,15,18,20,13,14,20, /* 15 .. 21 */
18,22,20,16,19,11,20, /* 22 .. 28 */
16,28,22,20,15,17,17, /* 29 .. 35 */
21,21,19,20,14,22,25, /* 36 .. 42 */
19,17,26,18,20,23,12 }; /* 43 .. 49 */
for (i = 0; i <= 49; i++)
printf(" %2d (%d) |\n", i, lottery[i]);
return 0;
}
注意:我已经为星星声明了一个变量,但我不知道如何将它实现到数组中以满足练习的规范。
答案 0 :(得分:5)
表示(i = 0; i <= 49; i ++)
数组访问超出范围。如果有这样的数组:
int lottery[49];
您只能访问索引为[0,48]的元素。否则,这是未定义的行为,所有投注均已关闭。糟糕的是编译器可能不会在这种情况下警告您或报告错误。
更改为:
for (i=0; i<49; i++)
答案 1 :(得分:2)
C数组具有基于0的索引。例如,在您的特定情况下,具有49个元素的数组,您可以拥有索引0到48(包括0和48)的有效访问权限。你应该改变
for (i = 0; i <= 49; i++)
到
for (i = 0; i < 49; i++)
否则,您将成为off-by-one,从而访问超出范围的内存。这会调用undefined behavior。
尽管如此,int main()
应该int main(void)
符合标准。
答案 2 :(得分:1)
在C(以及许多其他编程语言)中,数组是0索引的,这意味着它们开始将索引计为0。
这意味着如果您有 N 元素的数组,则最后一个有效索引是 N-1 。
在您的情况下,您有49个元素,但您的循环条件为i <= 49
,这意味着您将尝试从数组中读取索引49。由于这超出了有效范围,因此您可以在内存中读取数组后放置的任何值。
答案 3 :(得分:1)
将您的代码更改为:
for (i = 0; i < 49; i++)
printf(" %2d (%d) |\n", i+1, lottery[i]);
这样你只能循环49次(记住数组从0开始),而i+1
中的printf
会将错误修复一次。