在我正在编写的程序中,我目前有一个遍历数组的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
。有人能告诉我我做错了什么吗?
答案 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提供的代码也很完美,但我只是提供了另一种方法来使自己的代码工作。