我在弄清楚如何将char字符串char添加到2-dim数组中时遇到了一些麻烦。
作为编码“秘密消息”的替换密码的一部分,我正在尝试,
换句话说,我正在尝试做一些事情:
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阵列上仍然很模糊,而我所拥有的书并没有真正涵盖这种情况,因此非常感谢任何和所有的帮助。
答案 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];
}