存储事件索引的代码不起作用

时间:2013-09-16 00:37:37

标签: c arrays for-loop

在我正在编写的程序中,我目前有一个遍历数组的for循环,num[5],并检查该数组中是否有任何1,如下所示:

int counter = 0;
for (int i = 1; i <= 5; i++)
    if (num[i] == 1)
        counter++;

这项工作成功,但我现在正在尝试浏览数组,看看程序中1的索引是什么。所以,如果我有01001,我想创建一个包含1的位置的数组。以下是我到目前为止所尝试的内容:

int b[counter];
for (int k = 0; k <= counter; k++) {
   for (i = 0; i <= 5; i++) {
      if (num[i] == 1) {
          b[k] = i;
      }
    }
}

但这不会产生预期的结果。当我输入字符串时,比如1001,我得到444。有人能告诉我我做错了什么吗?

2 个答案:

答案 0 :(得分:1)

对于k的每个值,对于1的每次出现,您都要将b[k]设置为1的索引。因此,每个b[k]将具有最后1的索引。

尝试:

int b[counter];
int k = 0;
for (i = 0; i <= 5; i++) {
   if (num[i] == 1) {
       b[k++] = i;
   }
}

因此,每当它获得1时,它会将b[k]分配给索引,然后增加k

然后,在尝试打印k时,您还应该使用counter,而不是b

答案 1 :(得分:0)

问题出在你的代码的这一部分。

int b[counter];
for (int k = 0; k <= counter; k++) {
   **for (i = 0; i <= 5; i++) {
      if (num[i] == 1) {
          b[k] = i;
      }**
    }
}

假设您在1的数组索引1处获得01001。您指定b[k] = 1; 这完全有效。但是当循环继续时,您会在索引1处获得另一个4。因此,再次执行命令b[k] = 4;。 请注意,k的值在两个语句中都是常量,因此您将数组b作为44

所以你需要做的就是在获得1后立即打破内部for循环。

这是修改后的代码。您还需要跟踪迭代器i并使用变量new_pos // new position完成此操作。

int b[counter];
int new_pos=0;  //to keep track of the iterator
for (int k = 0; k <= counter; k++) {
   for (i = new_pos; i <= 5; i++) {
      if (num[i] == 1) {
          b[k] = i;
          new_pos = i+1;
          break;
      }
    }
}

Dukeling提供的代码也很完美,但我只是提供了另一种方法来使自己的代码工作。