运行此时,您应该收到段错误。 它必须是在函数中错误使用私有类变量的东西。 只需编译它并尝试运行它。 此代码由PaulMcKenzie编辑!
Affine.cpp
#include <string>
class Affine
{
std::string m_encryptedText;
std::string m_decryptedText;
std::string m_text;
int m_aKey;
int m_bKey;
public:
void encrypt();
Affine(const std::string &text,int aKey,int bKey) : m_text(text)
{
setKey(aKey, bKey);
}
void setKey(int x, int y) { m_aKey = x; m_bKey = y; }
};
void Affine::encrypt()
{
m_decryptedText = m_text;
for(int i=0;m_decryptedText[i] != '\0';i++)
{
m_encryptedText[i] = static_cast<char>(m_aKey*m_decryptedText[i]+m_bKey);
}
}
int main()
{
Affine a("hey", 1, 2);
a.encrypt();
}
答案 0 :(得分:1)
不要测试某些终止字符。 std :: string知道它的大小
for(auto& c : m_decryptedText)
{
c = static_cast<char>(m_aKey * c + m_bKey);
}
答案 1 :(得分:1)
std::string::operator[]
不进行边界检查; std::string::at
会这样做,如果尝试进行越界访问,则抛出异常。
您在字符串上循环而不检查它是否保留在字符串的边界内。只有遇到换行符(\n
)时,循环才会终止。如果没有换行符,那么它将循环直到达到界限,然后发生的事情是未定义的。
您的代码存在许多问题。对于一个它不是很C ++ - ish。您应该使用foreach
或迭代器或(C ++ 11及以后版本)for(auto &…: …)
来实现循环约束。对终止条件的任何检查都应该是额外的;它们可以被置于循环条件检查中,但它通常更容易阅读,以便在开始时将其作为一个测试 - 如果 - 中断,并将其余部分放在循环体中,如下所示:
for(…){
if( loop_break_condition ){ break }
…
}
旁注:Cesar Ciphers根本不是真正的加密。只有26个可能的键。仅这一点就很容易蛮力,但是如果给出足够长的密文,你甚至不必这样做:只需确定密文中的字母频率,对它们进行排序,作为关联平面的排序字母频率的关联假定语言的文本。对于拉丁字符的简单旋转密码,您可以查看最高频率的字母,并假设它是e
,为您提供密钥。
答案 2 :(得分:0)
谢谢你的帮助! :D我将尝试学习如何在vim中调试并了解有关字符串的更多信息。现在我用于每个循环来修复我犯下无限(?)循环和访问我不应该访问的内存地址的愚蠢错误。
这是有效功能的代码:
m_decryptedText = m_text;
for(char character : m_decryptedText)
{
m_encryptedText.push_back(static_cast<char>(m_aKey*character + m_bKey));
}