2011-01-15 2 views
0

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

#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; 

} 

в то время (с < 6 || б < 6) {

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 лет, и он будет смотреть на мой код и сказать: «что делает этот парень».

+2

Прошу прощения, я еще не в середине двадцатого, но должен сказать то же самое. Некоторая структура в вашем коде поможет ее прочитать;) –

+0

Вам не обязательно быть в середине сорока, чтобы задаться вопросом, что вы делаете ... :) Но все в порядке, все начинаются как новичок.Да, вы должны попытаться разбить свой код на функции, что упростит работу отдельных функций и сделает ваш код более удобочитаемым. Кроме того, индексы для массивов начинаются с 0, а не 1, что может быть частью проблемы, с которой вы столкнулись. – villintehaspam

ответ

0

Массив с первых пяти букв алфавита (размер 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) 

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

4

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

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

+0

... и начните с 0, а не 1 ... – villintehaspam

+0

Для удобства чтения я рекомендую использовать 'b <= 4'. Это просто стиль. – Maxpm

+2

@Maxpm: Я предпочитаю (b <5) себя, поскольку 5 - это точный размер/длина массива, который делает отношение предела к длине массива более очевидным. При использовании аргумента const, а не отвратительного магического числа, (b

0

Кроме того, с не динамического выделения массива, вы можете использовать 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

Спасибо вам всем, что он еще не работает, но я ближе –

Смежные вопросы