У меня есть эта функция, которая расшифровывает зашифрованное сообщение Цезаря с определенным ключом, и это дает мне правильные буквы для вывода, но есть некоторое странное черное пространство после него.
Вот функция:
#include <iostream>
#include <string.h>
#include "proj1.h"#include <cstdlib>
using namespace std;
int main()
{
char dec[MAXMSGLEN];int i = 0;
while(i < NUMMSGS){
char solve = SolveCipher(cipher[i], dec);if(solve == '\0')
{
cout << "Message #" << (i + 1) << " was not intertesting. " <<endl;
}
else
{
cout << "Message #" << (i + 1) << ",Key " << solve << endl;
cout << "\t" << dec << endl;
}i++;
}return 0;
}
void Decipher(char cip[], char key){
for(int i = 0; i < MAXMSGLEN && cip[i] != '\0'; i++){
if (cip[i] != ' '){
cip[i] = char(cip[i] - ((key - 'A')% 26));
if (cip[i] < 65){
cip[i] = ((65 - cip[i])-90);
}
}
else{
cip[i] = cip[i];
}
}
}char SolveCipher(const char cip[], char dec[]){
char msg[MAXMSGLEN];
char check[MAXMSGLEN];
char word[MAXCRIBLEN];
//Deciphers message with every key
for(char i = 'A'; i <= 'Z'; i++){
//clears msg
memset(msg, 0, (sizeof(msg)/sizeof(msg[0])));//stores cip in msg
for(int j = 0; cip[j] != '\0'; j++){
msg[j] = cip[j];
}
Decipher(msg, i);
cout<< msg <<endl;
}
return '\0';
}
Вот зашифрованные ключи, через которые я должен пройти:
const char cipher[NUMMSGS][MAXMSGLEN] = {
"HAAHJR HA KHDU AVTVYYVD",
"DHFGS NBKNBJ ZMC ZKK HR VDKK",
"Q PIDM JQMJMZ NMDMZ",
"JCTFGT DGVVGT HCUVGT UVTQPIGT",
"LRPYE I HTWW XPPE JZF LE ESP NZXXZYD",
"KLSQ GML LGG DSLW YGL FGLZAF AF EQ TJSAF",
"QEBC GUR ZVPEBSVYZ ORUVAQ GUR FGNGHR",
"GZSGZWD NX XTRJBMJWJ JQXJ FY UWJXJSY",
"RZVOCZM AJM OJHJMMJR HJMIDIB RVMH RDOC GJR XGJPYN",
"ROBO MYWO LKN XOGC DKVUSXQ DRSC KXN DRKD"};
И к вашему сведению мне нужно сохранить параметры такими, какие они есть сейчас. Я не могу изменить их на строки или что-то в этом роде.
Если я перебираю силовую петлю сквозь чёрные пространства, попадаю в слова
ROBO MYWO LKN XOGC DKVUSXQ DRSC KXN DRKD
QNAN LXVN KJM WNFB CJUTRWP CQRB JWM CQJC
PM▒M KWUM JIL VMEA BITSQVO BPQA IVL BPIB
OL▒L JVTL IHK ULD▒ AHSRPUN AOP▒ HUK AOHA
NK▒K IUSK HGJ TKC▒ ▒GRQOTM ▒NO▒ GTJ ▒NG▒
MJ▒J HTRJ GFI SJB▒ ▒FQPNSL ▒MN▒ FSI ▒MF▒
LI▒I GSQI FEH RIA▒ ▒EPOMRK ▒LM▒ ERH ▒LE▒
KH▒H FRPH EDG QH▒▒ ▒DONLQJ ▒KL▒ DQG ▒KD▒
JG▒G EQOG DCF PG▒▒ ▒CNMKPI ▒JK▒ CPF ▒JC▒
IF▒F DPNF CBE OF▒▒ ▒BMLJOH ▒IJ▒ BOE ▒IB▒
HE▒E COME BAD NE▒▒ ▒ALKING ▒HI▒ AND ▒HA▒
GD▒D BNLD A▒C MD▒▒ ▒▒KJHMF ▒GH▒ ▒MC ▒G▒▒
FC▒C AMKC ▒▒B LC▒▒ ▒▒JIGLE ▒FG▒ ▒LB ▒F▒▒
EB▒B ▒LJB ▒▒A KB▒▒ ▒▒IHFKD ▒EF▒ ▒KA ▒E▒▒
DA▒A ▒KIA ▒▒▒ JA▒▒ ▒▒HGEJC ▒DE▒ ▒J▒ ▒D▒▒
C▒▒▒ ▒JH▒ ▒▒▒ I▒▒▒ ▒▒GFDIB ▒CD▒ ▒I▒ ▒C▒▒
B▒▒▒ ▒IG▒ ▒▒▒ H▒▒▒ ▒▒FECHA ▒BC▒ ▒H▒ ▒B▒▒
A▒▒▒ ▒HF▒ ▒▒▒ G▒▒▒ ▒▒EDBG▒ ▒AB▒ ▒G▒ ▒A▒▒
▒▒▒▒ ▒GE▒ ▒▒▒ F▒▒▒ ▒▒DCAF▒ ▒▒A▒ ▒F▒ ▒▒▒▒
▒▒▒▒ ▒FD▒ ▒▒▒ E▒▒▒ ▒▒CB▒E▒ ▒▒▒▒ ▒E▒ ▒▒▒▒
▒▒▒▒ ▒EC▒ ▒▒▒ D▒▒▒ ▒▒BA▒D▒ ▒▒▒▒ ▒D▒ ▒▒▒▒
▒▒▒▒ ▒DB▒ ▒▒▒ C▒▒▒ ▒▒A▒▒C▒ ▒▒▒▒ ▒C▒ ▒▒▒▒
▒▒▒▒ ▒CA▒ ▒▒▒ B▒▒▒ ▒▒▒▒▒B▒ ▒▒▒▒ ▒B▒ ▒▒▒▒
▒▒▒▒ ▒B▒▒ ▒▒▒ A▒▒▒ ▒▒▒▒▒A▒ ▒▒▒▒ ▒A▒ ▒▒▒▒
▒▒▒▒ ▒A▒▒ ▒▒▒ ▒▒▒▒ ▒▒▒▒▒▒▒ ▒▒▒▒ ▒▒▒ ▒▒▒▒
▒▒▒▒ ▒▒▒▒ ▒▒▒ ▒▒▒▒ ▒▒▒▒▒▒▒ ▒▒▒▒ ▒▒▒ ▒▒▒▒
Есть идеи на этот счет?
Ваша проблема заключается в том, что вы меняете значения в строке «полностью» на MAXMSGLEN
, Теперь, что происходит, вы дешифруете основную часть сообщения (скажем, 10 символов) и не останавливаетесь, а продолжаете идти, обновляя значения за пределами диапазона.
Исправление — остановить, как только вы увидите нулевой терминатор конца строки '\0
:
void Decipher(char cip[], char key){
for(int i = 0; i < MAXMSGLEN && cip[i] != '\0'; i++){
if (cip[i] != ' '){
cip[i] = char(cip[i] - ((key - 'A')% 26));
if (cip[i] < 65){
cip[i] = ((65 - cip[i])-90);
}
}
}
}
Или, если вы предпочитаете более читаемый код (не втисните слишком много в блок управления циклами):
void Decipher(char cip[], char key){
for(int i = 0; i < MAXMSGLEN; i++){
if(cip[i] == '\0'){
break; // end the loop once we reached the string terminator
}
if (cip[i] != ' '){
cip[i] = char(cip[i] - ((key - 'A')% 26));
if (cip[i] < 65){
cip[i] = ((65 - cip[i])-90);
}
}
}
}
Обновить: Избегайте использования «магических чисел», таких как 65
а также 90
, ваш код будет гораздо проще понять, если вы используете 'A'
а также 'Z'
вместо. Вот фиксированная функция децифера:
void Decipher(char cip[], char key){
for(int i = 0; i < MAXMSGLEN; i++){
if(cip[i] == '\0'){
break; // end the loop once we reached the string terminator
}
if (cip[i] != ' '){
cip[i] = char(cip[i] - ((key - 'A')% 26));
if (cip[i] < 'A'){
cip[i] = ('Z' - ('A' - cip[i])); // <-- this is where you were getting negative values
}
}
}
}
Просто передайте строку как string
:
void Decipher(std::string& cip, char key) {
for (char& ch : cip) {
if (ch != ' ') {
ch = char(ch - ((key - 'A') % 26));
if (ch < 65) {
ch = ((65 - ch)-90);
}
}
}
}
Таким образом, информация о его длине также передается, и вы можете просто выполнять циклический цикл по символам.