C101:从用户输入填充数组的最佳方法?

时间:2008-09-21 23:49:01

标签: c arrays indexing

我很难理解并因此在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.

}

非常感谢任何建议!

更新

现在它有效!非常感谢你们所有你们这些即时回复。这绝对是一个很棒的社区,它对我帮助很大。

8 个答案:

答案 0 :(得分:4)

arr[idx] <= MAX

应该是

idx <= MAX

答案 1 :(得分: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,这也是超出范围的。 ;)所以你需要弄清楚如何解决这个问题。

答案 2 :(得分:2)

到罗马M:

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

for(idx = 0; idx&lt; MAX; ++ idx){

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

}

答案 3 :(得分: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;
}

答案 4 :(得分:1)

C数组从0开始计数。

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

int arr[MAX];
for ( .... && idx < MAX )

答案 5 :(得分:1)

arr[idx] <= MAX

应该是

idx < MAX

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

你也总是检查-1的“next”元素(arr [idx]!= -1)因为你在检查你的附加值之前递增了idx。

所以,如果你有

arr[idx-1] != -1
你会没事的。

答案 6 :(得分:1)

在你的第一个while循环中,

arr[idx] <= MAX

行应该读

idx <= MAX

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

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

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

答案 7 :(得分: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
}