2013-07-09 4 views
0

У меня возникли проблемы с выяснением того, как добавить строку char, char в двумерный массив.Добавление строки, char char, в массив 2dim

В рамках создания подстановки шифра для кодирования «секретных сообщений,» Я пытаюсь,

  1. принять ключевое слово,
  2. удалить все лишние буквы из указанных ключевого слова
  3. добавить новое ключевое слово в массив 5x5, char by char.
  4. Для остальных пространств в массиве заполните их в алфавитном порядке (только уникальные буквы, что означает исключение тех, которые уже введены из ключевого слова). Кроме того, поскольку это массив 5x5, это также означает, что я игнорирую букву Z. Я не буду пытаться ее кодировать.

Другими словами, я пытаюсь сделать что-то эффект:

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, символ на гольца, в 2 dim массива. Очевидно, что «PREATION» представляет собой строку длиной более 5 символов, но программа «знает» это кажущееся перекрытие и продолжает добавлять оставшиеся символы «ION» во вторую строку.

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

Зачем ему это известно?

Кроме того, мне все еще нужно добавить new_alphabet, начиная с arr [1] [3], и хотя я мог бы явно кодировать что-то вроде «начинаю добавлять в new_alphabet @ arr [1] [3]», это, очевидно, должно быть «dynamic» и начать добавлять в элемент сразу же после любого нового слова. Как мне это сделать?

Я предполагаю, что я все еще довольно нечеткий на массивах 2dim, а книга, которой я владею, на самом деле не охватывает такой случай, поэтому всякая помощь очень ценится.

ответ

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]; 
+0

Спасибо, эти работы просто великолепны! У меня есть пара (возможно, noobish) вопросов, хотя-1. (& arr [0] [0]) [i] и (& arr [0] [0]) [new_keyword.length() + i] относятся к стартовым местоположениям для где эти две строки добавлены, правильно? Не могли бы вы объяснить мне цель «&»? Я думал, что массивы всегда передавались по умолчанию. 2. Какова цель i HelloMyNameIsRay

+0

@HelloMyNameIsRay Чтобы ответить на ваш второй вопрос ('new_alphabet + new_keyword == 25'), я был немым и не понимал этого. Я исправлю это в ответе. – Jashaszun

+0

@HelloMyNameIsRay Оператор '&' является адресом оператора. Поэтому я беру адрес первого элемента массива 2d с помощью '@arr [0] [0]', а затем, поскольку это указатель, я тогда действую так, как будто это 1d-массив, и я пишу последовательно слоты памяти. – Jashaszun

0

Jashaszun предупреждает вас о первой части.

О Seconde части, попробуйте следующее:

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

Спасибо, это более внимательно следует формату for-loop, который у меня был. Думаю, он только начинает подсчитывать, где остановился предыдущий. – HelloMyNameIsRay

0

Как уже говорилось ранее, в Mutli тусклом массив, память смежный, просто убедитесь, что вы получаете доступ начало массива правильно указать на «символ * 'и присвойте ему соответствующее значение. Я пробовал этот код 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]; 
} 
Смежные вопросы