将字符串char(char)添加到2dim数组中

时间:2013-07-09 23:11:43

标签: c++ string multidimensional-array char

我在弄清楚如何将char字符串char添加到2-dim数组中时遇到了一些麻烦。

作为编码“秘密消息”的替换密码的一部分,我正在尝试,

  1. 接受关键字
  2. 从所述关键字中删除所有多余的字母
  3. 将此新关键字添加到5x5数组中,char by char。
  4. 对于数组中的其余空格,请按字母顺序填充(仅限唯一字母,表示不包括已从关键字输入的字母)。此外,由于这是一个5x5阵列,这也意味着我忽略了字母Z.我不会费心去编码。
  5. 换句话说,我正在尝试做一些事情:

    string keyword = "PREPARATION";
    string new_keyword = "PREATION";   // removed redundant letters, only unique ones remain
    
    string alphabet =     "ABCDEFGHIJKLMNOPQRSTUVWXY";
    string new_alphabet = "BCDFGHJKLMQSUVWXY";   //notice chars P, R, E, A, T, I, O, N are no longer present
    

    这第一部分我没有问题搞清楚。 但是,我想在数组中添加new_keyword和new_alphabet。

         0   1   2   3   4
       ---------------------
      0| P | R | E | A | T |
       ---------------------
      1| I | O | N | B | C |
       ---------------------
      2| D | F | G | H | J |
       ---------------------
      3| K | L | Q | Q | S |
       ---------------------
      4| U | V | W | X | Y |
       ---------------------
    

    首先添加字符串new_keyword,然后添加字符串new_alphabet。所以,在这一点上,我的代码是这样的:

    string new_keyword = "PREATION";
    string new_alphabet = "BCDFGHJKLMQSUVWXY";
    
    const int ROW = 5;
    const int COL = 5;
    
    char arr[row][col] = {0}; //initialize all values in array to 0
    
    for(int i = 0; i < new_keyword.length(); i++)
    {
        arr[0][i] = new_keyword[i];
    }
    

    到目前为止,将这个函数放入new_keyword,char by char,放入2dim数组中。显然,“PREATION”是一个超过5个字符的字符串,但程序“知道”这种明显的重叠,并继续将剩余的字符“ION”添加到第二行。

    arr[1][0] == 'I';
    arr[1][1] == 'O';
    arr[1][2] == 'N';
    

    为什么知道这样做?

    另外,我仍然需要从arr [1] [3]开始添加new_alphabet,虽然我可以显式地编写类似“开始添加new_alphabet @ arr [1] [3]”的内容,但这显然必须是“动态“并开始在任何new_keyword之后立即添加到元素中。 我该怎么做呢?

    我想我在2dim阵列上仍然很模糊,而我所拥有的书并没有真正涵盖这种情况,因此非常感谢任何和所有的帮助。

3 个答案:

答案 0 :(得分:1)

Why does it know to do this?因为在C和C ++中,数组的元素在内存中是连续排列的。多维数组只是数组的数组,因此也是连续的。因此,当您写入数组的第一行时,它只是继续写入内存并碰巧到达下一行,因为下一行是下一行在内存中。

如果要进行边界检查,可以执行以下操作:

const int ROW = 5;
const int COL = 5;

char arr[ROW][COL] = {0};

for (int i = 0; i < new_keyword.length() && i < ROW * COL; i++)
    (&arr[0][0])[i] = new_keyword[i];

for (int i = 0; i < new_alphabet.length() && i + new_keyword.length() < ROW * COL; i++)
    (&arr[0][0])[new_keyword.length() + i] = new_alphabet[i];

或者,正如HelloMyNameIsRay所说,因为我们已经知道new_keyword.length() + new_alphabet.length() == 25,我们可以简单地取出边界检查,如下所示:

const int ROW = 5;
const int COL = 5;

char arr[ROW][COL] = {0};

for (int i = 0; i < new_keyword.length(); i++)
    (&arr[0][0])[i] = new_keyword[i];

for (int i = 0; i < new_alphabet.length(); i++)
    (&arr[0][0])[new_keyword.length() + i] = new_alphabet[i];

答案 1 :(得分:0)

Jashaszun对第一部分的回答是正确的。

关于seconde部分,试试这个:

int j = 0;
for (int i = strlen (new_keyword); i < 25; i++) {
    arr[0][i] = new_alphabet[j];
    j++;
}

答案 2 :(得分:0)

如前所述,在mutli dim数组中,内存是连续的,只需确保正确访问数组的开头以指向'char *'并相应地分配值。 我尝试了这个for循环的代码snipet,它对我有用。请检查一下,希望这会有所帮助。

int len = new_keyword.length();

for ( int i =0; i < 25; i++){
    if ( i < len)
        *(*arr +i) = new_keyword[i];
    else
        *(*arr+i) = new_alphabet[i-len];
}