垃圾结果在我的代码中

时间:2017-05-28 16:22:50

标签: c arrays data-structures

嘿伙计,所以我正在研究这个代码,找到相同的数字并显示它们,到目前为止结果只是随机数我需要帮助。

int main(void){
int arr[10] = {1, 2, 3, 4, 5, 4, 8 ,8, 9, 10};
int i;
int j;
int same[10];
int ctr = 0;

for(i = 0; i < 10; i++){
    for(j = 10; j > 0;j--){
        if(arr[i] == arr[j]){
            same[ctr++] = arr[i];//store the similar numbers
        }
    }
}

for(i = 0; i < 10; i++){
    printf("%d", same[i]);
}
getch();
return 0;}

3 个答案:

答案 0 :(得分:1)

你自相矛盾。对于相同的数组,您使用两种不同的索引方案!!

  • 在外部循环(升序索引)中,您需要从0建立索引到9
  • 在内部循环(降序索引)中,您要从10索引1

内部循环索引为off-by-one,从而访问超出范围的内存,无效。这会导致undefined behavior

你需要成功

for(j = 9; j >= 0;j--)

之后,您尝试打印same数组中所有元素的值,而所有(或none )元素实际上,可能没有为值赋值。您将自动变量保留为未初始化,从而包含不确定的值。由于变量从未采用其地址,因此尝试使用该值将再次导致UB。

也就是说,一旦找到匹配项,您就可以使用continue跳转到外部循环。

答案 1 :(得分:0)

在9处开始第二个循环(j循环)并转到0。

答案 2 :(得分:0)

我在codechef编译器上运行了你的代码,它给出了一个运行时错误。因为在你的ctr ++步骤中,ctr的值超过了相同[]的数组的大小。

此外,在您的代码中,您将一个元素与自身进行比较,因此每个数字都将打印在列表中(因为i == j可能是一个可能的情况)

如果您在其中包含条件i!=j或迭代j from i+1 to 9,那么最好不要进行自我比较。以下是相同代码的工作片段(您的for循环): -

for(i = 0; i < 10; i++){
    for(j = 10; j > 0;j--){
        if(arr[i] == arr[j] && i!=j){
            same[ctr] = arr[i];//store the similar numbers
            ctr++;
            cout<<ctr<<" ";
        }
    }
}