C编程 - 值交换在随机数组槽中创造新的价值

时间:2014-11-02 17:08:23

标签: c arrays random

这是数组:

int deck [52] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10, 11,
2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10, 11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10, 11, 
2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10, 11};
for(i = 0; i < 52; i++){

我用这个来交换同一个数组中的2个值:

    randomNum1 = rand()%53;
    randomNum2 = rand()%53;
    temp = deck[randomNum1];
    deck[randomNum1] = deck[randomNum2];
    deck[randomNum2] = temp;
 }

我输入了打印状态,看看我是否可以在数组中找到一个特定的数字:

for(i = 0; i < 52; i++){
    randomNum1 = rand()%53;
    randomNum2 = rand()%53;
    printf("This is the random number 1: %d\n", randomNum1);
    printf("This is the random number 2: %d\n", randomNum2);
    temp = deck[randomNum1];
    printf("This is the temp and deck[randomNum1] BEFORE: %d and %d\n", temp, deck[randomNum1]);
    deck[randomNum1] = deck[randomNum2];
    printf("deck[randomnum1]AFTER: %d\n", deck[randomNum1]);
    printf("deck[randomNum2]BEFORE: %d\n", deck[randomNum2]);
    deck[randomNum2] = temp;
    printf("deck[randomNum2]AFTER: %d\n", deck[randomNum2]);
}

它进入的价值点总是随机的,它变成一个大数字。 从编译器打印出来:

  
      
  1. 这是随机数1:52
  2.   
  3. 这是随机数2:1
  4.   
  5. 这是临时和甲板[randomNum1] BEFORE:2271744和2271744
  6.   
  7. deck [randumNum1] AFTER:3
  8.   
  9. 甲板[randomNum2] BEFORE:3
  10.   
  11. deck [randomNum2]后:2271744
  12.   

另一个编译器运行:

  
      
  1. 这是随机数1:4
  2.   
  3. 这是随机数2:16
  4.   
  5. 这是临时和甲板[randomNum1] BEFORE:4和4
  6.   
  7. deck [randumNum1]之后:2271744
  8.   
  9. deck [randomNum2] BEFORE:2271744
  10.   
  11. deck [randomNum2] AFTER:4
  12.   

在此之前有几个if语句和一个while循环,但它们都没有触及此数组中的值。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您将超出deck数组的范围,因为它的有效索引从0开始并以51结束。您尝试访问索引52,这会导致未定义的行为。

要避免这种情况,请使用

randomNum1 = rand()%52;
randomNum2 = rand()%52;