您好,我无法弄清楚为什么while循环没有终止“ while(values [i]!= -99)”,当我将其更改为==时,的确确实是在改变行为,所以被正确阅读,我只是看不到东西,谢谢!
#include <stdio.h>
#define NUM ((int)(sizeof(values)/sizeof(values[0])))
int main(){
int values[10];
int i = 0;
printf("please enter the values you want reversed, terminate with -99\n");
while(values[i] != -99){
for(i = 0; i<NUM ; i++){
scanf("%d",&values[i]);
}
}
for(i = NUM; i>NUM; i--){
printf("%d",values[i]);
}
}
答案 0 :(得分:2)
您的第一个for
循环递增i
直到达到NUM
的值。当其终止时,while
轮到并测试是否values[i] != -99
。但是,i
目前不在数组范围内(它等于NUM
,而数组的索引以NUM-1
结尾),所以您会得到未定义的行为:
-99
)都是不合理的。编辑
这是一个可能的解决方案,
首先,输入数据。最多读取NUM
个值并将它们存储在数组中。测试每个值,如果输入了“停止”值,则中断循环。
for(i = 0; i < NUM ; i++) {
scanf("%d",&values[i]);
if(values[i] == -99)
break;
}
然后输出数据。如果输入了所有NUM
值,则i
现在等于NUM
。如果输入了“停止”值-99
,则i
表示“停止”在数组中的位置。无论哪种方式,i
都会比最后一个值晚一,因此您可以将其从当前值递减到零:
while(--i >= 0) {
printf("%d ",values[i]);
}
答案 1 :(得分:0)
您似乎想在结束.state
循环时检查i
的值-因为一旦while
循环完成,它不会重置为0
,但是从结束for
循环到现在仍然10
。
答案 2 :(得分:0)
目前尚不清楚您是否希望使用WHILE循环完成此任务。如果您希望用户通过输入values
来终止-99
的“填充过程”,则代码应如下所示:
// ...
printf("Please enter the values you want reversed; terminate with -99.\n");
for (i=0;i<NUM;i++)
{
scanf("%d",&values[i]);
if (values[i]==-99)
break;
}
//...
在您的代码中,无论用户输入什么内容,您都在填写values
。然后,在用户为每个元素输入新值之后,检查values
的第11个元素(“不存在”;在其他编程语言,如C#中,将抛出诸如IndexOutOfRangeException之类的东西)。基本上,您正在访问不知道其用途的内存;这可能很危险,并可能导致崩溃。
另外,请注意,您用于打印数组内容的语句不正确,应为:
for(i=NUM-1;i>=0; i--){
printf("%d",values[i]);
}
问题在于,如果您从i=NUM
开始,您将再次访问values
的“不存在”的第11个元素。另外,您应该注意,values
可能无法完全填充用户的有效值(因为用户可以通过输入-99
来终止“填充过程”)。
答案 3 :(得分:0)
#define ARRSIZE(array) (sizeof(array) / sizeof(array[1]))
int main()
{
int values[10] = {0};
size_t i = 0;
printf("please enter the values you want reversed, terminate with -99\n");
do
{
if(scanf("%d",&values[i]) != 1)
{
printf("SCANF error at index %zu\n", i);
break;
}
}while(values[i] != -99 && ++i < ARRSIZE(values));
for(size_t index = i; index > 0; index--)
{
printf("%d\n",values[index - 1]);
}
}
答案 4 :(得分:-1)
在while
循环完成之前,values[i]
循环不会检查for
参数。请尝试以下操作:
i=0;
while(values[i] != -99){
scanf("%d", &values[i]);
i=i+1;
if (NUM == i) break;
}
以此替换代码中当前的while
循环将确保每次检查索引i
的值。