Программа сбоя цикла, связанная с 2D массивами - PullRequest
0 голосов
/ 16 января 2011

Я создаю программу кодирования, и когда я даю ей указание создать сетку 5X5 на основе алфавита, пропуская буквы, которые соответствуют определенным предопределенным переменным (которые задаются значениями при вводе пользователем во время выполнения).У меня есть цикл, который инструктирует цикл продолжать работать до тех пор, пока значения, которые обращаются к массиву, выходят за пределы, кажется, что цикл вызывает проблему.Этот код стандартизирован, поэтому не должно быть особых проблем при его компиляции в другом компиляторе.Также было бы лучше разделить мою программу на функции?вот код:

#include<iostream>
#include<fstream>
#include<cstdlib>
#include<string>
#include<limits>

using namespace std;
int main(){


 while (!cin.fail()) {      

char type[81];
char filename[20];
char key [5];
char f[2] = "q";
char g[2] = "q";
char h[2] = "q";
char i[2] = "q";
char j[2] = "q";
char k[2] = "q";
char l[2] = "q";
int a = 1;
int b = 1;
int c = 1;
int d = 1;
int e = 1;
string cipherarraytemplate[5][5]= {
{"a","b","c","d","e"},
{"f","g","h","i","j"},
{"k","l","m","n","o"},
{"p","r","s","t","u"},
{"v","w","x","y","z"}

};
string cipherarray[5][5]= {
{"a","b","c","d","e"},
{"f","g","h","i","j"},
{"k","l","m","n","o"},
{"p","r","s","t","u"},
{"v","w","x","y","z"}

};





cout<<"Enter the name of a file you want to create.\n";

cin>>filename;


ofstream outFile;
outFile.open(filename);
outFile<<fixed;
outFile.precision(2);
outFile.setf(ios_base::showpoint);
cin.ignore(std::numeric_limits<int>::max(),'\n');






cout<<"enter your codeword(codeword can have no repeating letters)\n"; 

cin>>key;

while (key[a] != '\0' ){

while(b < 6){
cipherarray[b][c] = key[a];

 if (  f == "q" ) {
 cipherarray[b][c] = f;
}

 if ( f != "q" && g == "q"  )
 {
cipherarray[b][c] = g;
}

 if ( g != "q" && h == "q" )
 {
cipherarray[b][c] = h;
}

 if ( h != "q" && i == "q"  )
 {
cipherarray[b][c] = i;
}


 if ( i != "q" && j == "q" ) 
{
cipherarray[b][c] = j;
}

 if ( j != "q" && k == "q" )
 {
cipherarray[b][c] = k;
}

 if ( k != "q" && l == "q" )
 {
cipherarray[b][c] = l;
}
a++;
b++;

}

c++;
b = 1;

}

while (c <6 || b <6) {</em>

if (cipherarraytemplate[d][e] == f || cipherarraytemplate[d][e] == g || cipherarraytemplate[d][e] == h || cipherarraytemplate[d][e] == i ||
cipherarraytemplate[d][e] == j || cipherarraytemplate[d][e] == k || cipherarraytemplate[d][e] == l){
 d++;                 
}
else {
cipherarray[b][c] = cipherarraytemplate[d][e];
d++;
b++;
}
if (d == 6){
d = 1;
e++;
}
if (b == 6){
c++;
b = 1;
}

}

 cout<<"now enter some text."<<endl<<"To end this program press Crtl-Z\n";

while(!cin.fail()){

 cin.getline(type,81);

outFile<<type<<endl;
}

outFile.close();
}
} 

Я знаю, что там будет какой-то парень сорока лет, который наткнется на этот пост, он программирует 20-несколько лет, и он собирается посмотреть на мой код и сказать: «что делает этот парень».

Ответы [ 3 ]

4 голосов
/ 16 января 2011

cipherarray имеет длину [5] записей, что означает, что он может быть проиндексирован с любым из (0, 1, 2, 3, 4) - передача в 5 выходит за пределы.

Измените значение while (b < 6) на значение while (b < 5), чтобы не выходить за границы массива (и аналогично в других местах, где вы проверяете свои индексы).

0 голосов
/ 16 января 2011

Кроме того, с нединамическим массивом размещения, вы можете использовать sizeof (), чтобы узнать размер массива:

const char tab[] = "hello world";

for (unsigned int i = 0; i < sizeof(tab); ++i) { //then you can easily iterate on each, including \0
      std::cout << tab[i] << std::endl; 
}

Это работает только для локального массива, sizeof (char *) вернет размер указателя (4/8 байт)

0 голосов
/ 16 января 2011

Массив с первыми пятью буквами алфавита (размером 5) можно визуализировать примерно так:

Index 0: a
Index 1: b
Index 2: c
Index 3: d
Index 4: e

Как видите, индекс первого значения фактически равен нулю.Это может сбить с толку!

char MyCharacterArray[5]; // Initializes a one-dimensional character array with a size of five.
MyCharacterArray[0] = 'a'; // Sets the first value to a.
MyCharacterArray[4] = 'e'; // Sets the last value to b.
MyCharacterArray[5] = `f`; // This will generate errors, as the last index of MyCharacterArray is 4!

Базовый цикл для запуска через массив может выглядеть следующим образом:

for (int Index = 0; Index <= 4; Index++)
{
    // ...
}

Здесь ваш код сталкивается с проблемами.Ваш цикл while использует эквивалент этого:

while (Index < 6)

То же самое, что и это:

while (Index <= 5)

Итак, на последнем прогоне цикла, где Index равно 5он пытается получить доступ к значению, которое находится за пределами диапазона массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...