为什么我的while循环不终止? while(values [i]!= -99)

时间:2020-08-14 17:26:12

标签: c

您好,我无法弄清楚为什么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]);
}

}

5 个答案:

答案 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)

  1. 除了第一个循环之外,您都具有其他循环中未定义的行为。
  2. 循环不正确。
#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]);
    }

}

https://godbolt.org/z/dq14n8

答案 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的值。