РЕДАКТИРОВАТЬ: решено. Звбра, похоже, прав. предоставление только 4 символов для склепа было причиной проблемы. Должен понять почему, потому что мне сказали, что getline отбросил последний символ ...
Здравствуйте, товарищи по укладке.
Я хочу начать с того, что я пытался отладить и решить свою проблему самостоятельно, но (вероятно, из-за моего недостатка знаний по сборке и почти всего в целом) я потерпел неудачу при этом.
Поэтому я пришел сюда в надежде, что вы сможете мне помочь :).
Я решил написать простую (я думаю) программу шифрования, скорее тест, чем все остальное.
Он разделен на 2 части:
Alghorithm.h (Да, я знаю, что это орфографическая ошибка.), Который содержит класс 'Crypter'
#include <iostream>
#include <cmath>
using namespace std;
class Crypter
{
private:
char Crypt[4];
public:
Crypter()
{
getCrypt:
cout<<"\nEnter a 4 character password: ";
cin.getline(Crypt,5);
if (cin.fail())
{
cout<<"\n\nError while reading password. 4 CHARACTERS MAXIMUM.\n\n";
cin.sync(); cin.clear();
goto getCrypt;
}
}
void Encrypt(string& data)
{
for (int i=0; i<data.size();i++)
{
int offset=i;
if (offset>5)
{
while (offset>5)
{
offset-=6;
}
}
float base = 2.0f;
int testbit=pow(base,offset);//gets bit to test. Ex: if offset= 1 (2^1=2=binary 10) test bit is the 2nd least significant bit
if (data[i]!=(data[i]^testbit)) //if testbit is 1 (tested using xOR)
{
data[i]= data[i]^Crypt[2]; //-> encrypt using xOR Crypt[2]
testbit=pow(base,offset+2);
if(data[i]!=data[i]^testbit)// then if testbit is 1 (tested using xOR)
{
data[i]=(data[i]^Crypt[0])+Crypt[3]; //-> encrypt using xOR Crypt[0] then adding crypt[3]
}
else
{
data[i]=(data[i]^Crypt[1])+Crypt[1];//-> encrypt using xOR Crypt[1] then adding crypt[1]
}
}
else
{
data[i]=((data[i]^Crypt[3])^Crypt[0])+Crypt[2];//-> encrypt using xOR Crypt[1] then xOR Crypt[0] and finally adding crypt[1]
}
}
return;
}
};
и main.cpp
#include "Alghorithm.h"
int main()
{
string data="This sentence is going to be encrypted";
Crypter Crypter;
cout<<"\nEncrypting...";
Crypter.Encrypt(data);
cout<<"\n\nEncryption Successful\n\nEncrypted string: "<<data<<endl;
cin.sync(); cin.clear();
}
Теперь вы, эксперты по программированию, должны думать, насколько неуклюжий мой алгоритм
и что большинство частей даже не имеют смысла для алгоритма шифрования (что возможно)
но притворитесь, что это хороший алгоритм, который имеет смысл.
Это проблема:
Компилируется. Это работает. Он шифрует предложение и печатает зашифрованные
версия. Но прямо перед окончанием программы (на скриншотах видно, что я забыл
чтобы вернуть значение в main, но я исправил это, и проблема не изменилась немного) выскакивает сообщение
вверх (во время работы через компилятор) в режиме отладки [Проверка снимков экрана] и 3 в режиме выпуска;
Большинство из них предупреждают об ошибке, вызванной повреждением стека вокруг переменной переменной Crypter.
Я даже не близок к тому, чтобы считаться опытным программистом, поэтому я пришел сюда с просьбой о помощи.
Так как ошибка появляется только после завершения программы, значит ли это, что это проблема очистки?
Я полностью потерян здесь. Любые ответы приветствуются.
ПРИМЕЧАНИЕ. Я также включил часть кода сборки (соответствующую часть), предоставляемую отладчиком;
Надеюсь, что это имеет какое-то применение (проверьте «встроенный» комментарий в asm-коде, чтобы узнать «позицию» ошибки);
Критика моего дерьмового кода по желанию:) (Кажется, есть проблема, поскольку результирующая зашифрованная строка отличается от режима отладки до выпуска?: /?.
-João
Экраны:
Как выглядит программа до того, как я нажму ENTER (отладка) : http://i44.tinypic.com/3ert2.png
Как выглядит программа до того, как я нажму ENTER (Release) http://i42.tinypic.com/2nld45f.png
Ошибка отображается после нажатия ENTER (отладка) http://i41.tinypic.com/bhltoy.png
1-ая ошибка, отображаемая после нажатия ENTER (отпускание) http://i42.tinypic.com/28lchac.png
2-ая ошибка, отображаемая после нажатия ENTER (отпускание) http://i40.tinypic.com/2h3ttmw.png
3-я ошибка отображается после нажатия ENTER (Отпуск) http://i41.tinypic.com/2lc5suw.png
Код ASM, предоставленный отладчиком http://pastebin.com/TTXUn0T2