将一个数组中的元素移动/移除到另一个数组中

时间:2014-12-11 12:36:57

标签: c arrays elements

我在C中涉及数组的项目。我所拥有的是一个包含7个字符的数组,我需要用7中的4个随机元素填充数组。然后我将自己填充的数组进行比较。我不想允许重复。我知道如何将每个元素与另一个元素进行比较以防止它,但显然这不是最佳的。因此,如果我随机选择它们从数组中删除元素,我会删除它们被复制的任何可能性,或者我认为。我的问题是我该怎么做?

示例:

char name[2+1] = {'a','b'};
char guess[2+1] = {};

所以当它随机选择ab并将其放入guess[]时, 但是下次它运行它可能会选择相同的。删除它将摆脱这种机会。 在更大的数组中,它会比完成所有比较更快。

伙计们只是打了我。
我不能用数组中的最后一个元素切换我所用的元素并将其缩小一个吗? 然后显然每次将rand() % x模数改为1?

3 个答案:

答案 0 :(得分:1)

以下是两种可能的方式"删除" C中数组中的项目(还有其他可能的方式):

  1. 将数组中的项替换为其他项,表明此项无效。

    例如,如果您有char数组

    +---+---+---+---+---+---+
    | F | o | o | b | a | r |
    +---+---+---+---+---+---+
    

    你想"删除"它可以b 看起来像

    +---+---+---+------+---+---+
    | F | o | o | \xff | a | r |
    +---+---+---+------+---+---+
    
  2. 将数组的剩余内容向上移动一步。

    要使用上面的相同示例,移位后的数组看起来像

    +---+---+---+---+---+---+
    | F | o | o | a | r |   |
    +---+---+---+---+---+---+
    

    这可以通过简单的memmove电话来实现。

    要记住的重要一点是,您需要跟踪大小,并在每次删除角色时减少它。

  3. 当然这两种方法都可以组合在一起:首先在循环中使用第一个,一旦完成,你可以永久删除第二个数组中未使用的条目。

答案 1 :(得分:1)

我可以给你步骤去做你想做的事。自己编码。在此之前让我们概括一下这个问题。

  

你有一系列'm'元素,你要填充另一个'n'长度   通过从第一个数组中选择随机元素来实现数组   没有重复的数字。我们先假设所有数字都是唯一的   阵列。

步骤:

  1. 保持指针或计数以跟踪数组中的当前位置。 最初将其初始化为零索引。我们称之为当前。
  2. 在当前和'm'的范围内生成有效的随机数。让我们说吧。继续生成,直到找到范围内的东西。
  3. 使用first_array [i]填充second_array。
  4. 交换first_array [i]和first_array [current]并增加当前值但为1。
  5. 重复步骤2'n'次。
  6. 假设你的数组是2,3,7,5,8,12,4。它的长度是7.你要用它填充5个长度的数组。

    • 将电流初始化为零。
    • 生成随机索引。让我们说4.检查它是否在当前(0)和m(7)之间。它是。
    • 交换first_array [4]和first_array [0]。数组变为8,3,7,5,2,12,4
    • 将电流增加1并重复。

答案 2 :(得分:0)

不要忘记数组只是C中相同类型项集开头的指针。因此要删除元素,只需要用给定索引替换元素即可。一个值,表明它不是有效的条目,即null

由于条目是一个简单的数字,因此没有内存管理问题(我知道),但如果它是一个对象,如果它是你上面的最后一个引用,则必须删除它。

所以,让我们保持简单:

array2[index2] = array1[index1];

array1[index1] = null;

另一种方法是改变原始数组的大小,使其包含少一个元素,正如Joachim在他的回答中所述。