尝试运行可执行文件时出现分段错误

Segmentation fault when trying to run executable

本文关键字:分段 错误 试运行 可执行文件      更新时间:2023-10-16

运行它时,你应该得到一个段错误。 它一定是函数中私有类变量的错误使用。 只需编译它并尝试运行它。 此代码由 PaulMcKenzie 编辑!

仿射.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] != '';i++)
{
m_encryptedText[i] = static_cast<char>(m_aKey*m_decryptedText[i]+m_bKey);
}
}
int main()
{
Affine a("hey", 1, 2);
a.encrypt();
}
std::string::operator[]

不进行边界检查;std::string::at这样做,并在尝试越界访问时引发异常。

您正在循环字符串,而不检查它是否停留在字符串的边界内。仅当遇到换行符 (n( 时,循环才会终止。如果没有换行符,那么它将循环直到到达边界,然后会发生什么是不确定的。

您的代码存在许多问题。首先,它不是很C++。应使用foreach或迭代器或(C++ 11 及更高版本(for(auto &…: …)来实现循环约束。对终止条件的任何检查都应该是额外的;它们可以放入循环条件检查中,但通常更容易阅读,在开始时将其作为测试如果中断,其余部分放在循环主体中,如下所示:

for(…){
if( loop_break_condition ){ break }
…
}

附带说明:塞萨尔密码根本不是真正的加密。只有 26 个可能的键。仅此一项就很容易进行暴力破解,但给定足够长的密文,您甚至不必这样做:只需确定密文中的字母频率,对它们进行排序,就像将假定语言中纯文本的排序字母频率相关联一样。对于拉丁字符上的简单旋转密码,您可以查看最高频率的字母并假设它是一个e,为您提供密钥。

不要测试某些终止字符。一个 std::string 知道它的大小

for(auto& c : m_decryptedText)
{
c = static_cast<char>(m_aKey * c + m_bKey);
}

感谢您的帮助! :D我将尝试学习如何在 vim 中进行调试并了解有关字符串的更多信息。现在,我使用每个循环来修复我的愚蠢错误,即进行无限(?(循环并访问我不应该访问的内存地址。

这是工作函数的代码:

m_decryptedText = m_text;
for(char character : m_decryptedText)
{
m_encryptedText.push_back(static_cast<char>(m_aKey*character + m_bKey));
}