首先请用简单的词语,因为我的英语不是很好;)
现在问题是:
我想编写一个可以使用简单的Caesar算法加密我的文本的程序。这意味着字母字符成为字母表中的后一个字符,但是我的程序不会在Z之后的字母表开头处开始。现在代码:
void Entschlüsseln(char Text[50], int Schlüssel)
{
char Entschlüsselt[sizeof(Text)];
for (int x = 0; x < sizeof(Text)-1; x++)
{
Entschlüsselt[x] = '\0';
}
char Zeichen;
for (int i = 0; i < sizeof(Text)-1; i++)
{
if (Text[i] != '\0')
{
Zeichen = Text[i];
for (int j = 0; j < Schlüssel; j++)
{
_asm
{
mov al, Zeichen
cmp al, 90
jb Großbuchstabe
mov al, Zeichen
sub al, 32
mov Zeichen, al
Großbuchstabe:
inc Zeichen
mov al, Zeichen
cmp al, 90
ja Anfang_Alphabet
jmp Ende
Anfang_Alphabet:
mov Zeichen, 65
Ende:
}
}
Entschlüsselt[i] = Zeichen;
}
}
cout << endl << Entschlüsselt;
}
我希望没关系,你可以帮助我
答案 0 :(得分:1)
在没有汇编的情况下,在纯C ++中实现起来要容易得多。
Zeichen = tolower(Text[i]);
Zeichen += Schlussel; // Note, the C++ standard does not guarantee that non-ASCII characters such as U-umlaut are allowed in identifiers
if (Zeichen > 'Z') Zeichen -= 26;
Entschlusselt[i] = Zeichen;
答案 1 :(得分:0)
可能你只想更改角色,如果它真的是一个字母,那么空格和其他角色就会留下来。而且您正在使用C ++,因此使用std::string
代替char[]
更容易。
#include <iostream>
#include <string>
using std::string;
void caesar_encode(std::string &text, int schluessel) {
for (size_t i = 0; i < text.length(); i++) {
char zeichen = text[i];
int buchstabe = -1; // -1 == unbekannt, 0 = a, 1 = b, ... 25 = z
if ('A' <= zeichen && zeichen <= 'Z') {
buchstabe = zeichen - 'A';
} else if ('a' <= zeichen && zeichen <= 'z') {
buchstabe = zeichen - 'a';
}
char codiertes_zeichen = zeichen;
if (buchstabe != -1) {
int codierter_buchstabe = (buchstabe + schluessel) % 26;
char alphabet_anfang = zeichen - buchstabe; // 'A' oder 'a'
codiertes_zeichen = alphabet_anfang + codierter_buchstabe;
}
text[i] = codiertes_zeichen;
}
}
int main() {
string s("Hallo, Welt");
caesar_encode(s, 13);
std::cout << s << "\n";
return 0;
}
试着理解这段代码,应该是可能的。
答案 2 :(得分:0)
我认为错误的代码是这一行:
cmp al, 90
jb Großbuchstabe
由于90(在ASCII中是Z
)是Großbuchstabe,因此不应从中减去32。成功:
cmp al, 90
jbe Großbuchstabe