1

我很难理解,因此很难在 C 中手动管理数组和索引。这是我的两种经典方法,但它们似乎不起作用,因为它们在达到条件时会继续循环:

#include<stdio.h>
#define MAX 255

int main(){

    int arr[MAX]={0};
    int idx=0;

    /* Approach #1 */

    printf("Enter elements, -1 to finish:\n");
    scanf("%d", &arr[idx]);

    while(arr[idx-1] != -1 && idx < MAX){
        printf("Enter elements, -1 to finish:\n");
        scanf("%d", &arr[idx]);
        idx++;        
    }

    /* Approach #2 */

    do{
        printf("Enter elements, -1 to finish:\n");
        scanf("%d", &arr[idx]);
        idx++;
    }while(arr[idx-1] != -1 && idx < MAX);

    // Main func continues here.

}

任何建议将不胜感激!

更新:

现在它起作用了!非常感谢你们所有人的即时回复。这绝对是一个很棒的社区,它帮助了我很多。

4

8 回答 8

4
arr[idx] <= MAX

应该

idx <= MAX
于 2008-09-21T23:50:52.497 回答
2
while(arr[idx] != -1 && idx <= MAX){ // Fixed by sklivvz
    printf("Enter elements, -1 to finish:\n");
    scanf("%d", &arr[idx]);
    idx++;        
}

首先,您应该检查索引变量 idx 是否小于 MAX(不小于或等于)。如果您的索引等于 MAX,您将超出范围。MAX = 10 的数组的索引值为 0 到 9,包括 9,但不是 10。

其次,将第一个元素添加到 arr[0],将索引从 0 增加到 1,然后跳回 while 条件并检查 arr[1] == -1,它不是。所以检查 arr[idx-1] != -1。但是请注意,第一次进入 while 循环时,您实际上会检查 arr[-1] != -1,这也超出了范围。;) 所以你需要弄清楚如何解决这个问题。

于 2008-09-22T00:07:42.953 回答
2

到罗马 M:

首先,问这个问题的人刚开始上编程课程,可能还没有学过指针。其次,您现在同时处理计数器和指针。我不确定我是否看到这样做与使用这样的索引相比有什么好处:

for(idx=0;idx < MAX;++idx) {

scanf("%d", &arr[idx]);
if(arr[idx] == -1)
    break;

}

于 2008-09-22T00:21:21.440 回答
2

使用 for 循环可以消除对凌乱的idx-1检查代码的需要:

/* Approach #3*/
int i;
int value;

for (i = 0; i < MAX; ++i)
{
  printf("Enter elements, -1 to finish:\n");
  scanf("%d", &value);
  if (value == -1) break;
  arr[i] = value;
}
于 2008-09-22T03:20:06.843 回答
1

C 数组从 0 开始计数。

如果分配一个大小为 MAX 的数组,则访问 MAX 处的元素将是一个错误。将循环更改为;

int arr[MAX];
for ( .... && idx < MAX )
于 2008-09-21T23:54:25.717 回答
1
arr[idx] <= MAX

应该

idx < MAX

除非您正在检查项目而不是索引。

您还始终检查 -1 的“下一个”元素 (arr[idx] != -1),因为您在检查附加值之前增加了 idx。

所以如果你有

arr[idx-1] != -1

你会没事的。

于 2008-09-21T23:54:32.797 回答
1

在您的第一个 while 循环中,

arr[idx] <= MAX

行应该读

idx <= MAX

在您的第二个循环中,您在测试之前增加 idx - 它应该以

} while ((arr[idx-1] != -1) && (idx-1 <= MAX));

我也倾向于将所有内部条件括起来,以绝对确定优先级是正确的(因此上面有额外的括号)。

于 2008-09-21T23:57:19.563 回答
1

我会选择这样的东西。

您不必担心数组边界和其他令人困惑的情况。

int cnt = MAX;        // how many elements in the array, in this case MAX
int * p = &arr[0];    // p is a pointer to an integer and is initialize to the address of the first
                      // element of the array. So now *p is the same as arr[0] and p is same as &arr[0]

// iterate over all elements. stop when cnt == 0
while (cnt) {

    // do somthing
    scanf("%d", *p); // remember  that *p is same as arr[some index]
    if (*p == -1)    // inspect element to see what user entered
        break;

    cnt --;  // loop counter
    p++;     // incrementing p to point to next element in the array
}
于 2008-09-22T00:15:27.273 回答