Arrays 在C/C+中输入未知数量的数组值+;他有奇怪的行为
我需要用未知数量的元素填充整数数组。我使用while循环输入值,并在输入非整数值时退出循环。在循环外部,整数j被初始化为0,并用于寻址循环内部的数组元素。在循环的每一轮中,我检查输入值分配给数组元素v[j]前后j的值,然后j递增。 根据为声明中的数组选择的大小(在下面的示例v[8]),索引j意外地受到赋值本身的影响:在下面的示例中,当赋值前j等于11时,赋值后它变为2,然后将其全部搞乱。因此,代码无法为数组分配正确的输入值 我确实缺乏一些关于C/C++阵列管理的更深层次的知识。。。任何人都可以帮助填补空白,解释我的代码明显奇怪的行为Arrays 在C/C+中输入未知数量的数组值+;他有奇怪的行为,arrays,c,loops,while-loop,scanf,Arrays,C,Loops,While Loop,Scanf,我需要用未知数量的元素填充整数数组。我使用while循环输入值,并在输入非整数值时退出循环。在循环外部,整数j被初始化为0,并用于寻址循环内部的数组元素。在循环的每一轮中,我检查输入值分配给数组元素v[j]前后j的值,然后j递增。 根据为声明中的数组选择的大小(在下面的示例v[8]),索引j意外地受到赋值本身的影响:在下面的示例中,当赋值前j等于11时,赋值后它变为2,然后将其全部搞乱。因此,代码无法为数组分配正确的输入值 我确实缺乏一些关于C/C++阵列管理的更深层次的知识。。。任何人都可以帮
#include <stdio.h>
int main()
{
int j = 0, m, v[8];
printf("Enter an integer: to finish enter x\n");
while (scanf("%d", &m))
{
printf("j before assignment:%d - ", j);
v[j] = m;
printf("j after assignment:%d - ", j);
printf("v[j] after assignment:%d\n", v[j]);
j++;
}
return 0;
}
#包括
int main()
{
int j=0,m,v[8];
printf(“输入一个整数:要完成,请输入x\n”);
while(scanf(“%d”、&m))
{
printf(“分配前的j:%d-”,j);
v[j]=m;
printf(“分配后的j:%d-”,j);
printf(“赋值后的v[j:%d\n”,v[j]);
j++;
}
返回0;
}
您的写入超出了v
的数组边界。要避免这种情况,请在for循环中选中j
,例如,将while(…)
替换为
for (j = 0; j < 8 && scanf("%d", &m) == 1; ++j) {
// ...
}
for(j=0;j<8&&scanf(“%d”,&m)==1;++j){
// ...
}
这样,循环在到达数组末尾(v[7]
)后停止
要评论“奇怪”行为,请阅读有关堆栈和堆栈布局的内容,例如
一如既往,检查和列出图书清单< /P>如果你使用C++,那么使用<代码> CIN < /代码>,使用<代码>矢量< /代码>,当数组只有8的大小时,你被分配给V(11)。你以为会发生什么?如果在数组边界之外赋值,则会得到未定义的行为。未定义的行为通常是奇怪的,试图理解它或多或少是毫无意义的。我不确定你对这个问题的期望是什么。请解释您的困惑所在。您在
v
数组之外编写代码,这会导致未定义的行为,在这种情况下很可能会覆盖一个或多个其他变量,因为编译器很可能会将您的所有变量放在彼此相邻的位置。这可能就是你在这里看到的。我确实缺乏一些关于C/C++阵列管理的更深入的知识:(当你标记你的问题时)或者,请选择一个。正如@克里斯姆所说的,实现C++所需的正确方式将与C++相比有很大的不同。如果你使用这种语言,请相应地更新你的问题。我需要的是一种动态填充数组的方法,让它在我进入新的值时增长:这是“不可能完成的任务”吗?我知道定义了一个有限大小的v之后,会有一些问题超过它,但是为什么变量j会受到这些问题的影响呢?它不是一个自变量吗?它的值在使用j++的每次循环中都会增加?