尝试运行可执行文件时出现分段错误
Segmentation fault when trying to run executable
运行它时,你应该得到一个段错误。 它一定是函数中私有类变量的错误使用。 只需编译它并尝试运行它。 此代码由 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));
}
相关文章:
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- 分段错误当我试图运行程序时出错
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 尝试使用集合函数时出现分段错误
- 我无法缩小此分段错误的原因
- g++的分段错误(在NaN上使用to_string两次时)
- 我是如何在这段代码中出现分段错误的
- 创建结构的数组时遇到分段错误
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 在 c++ 中实现 Trie 时出现分段错误
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 为什么我遇到分段错误?
- 动态类的分段错误(家庭作业问题)
- 分段错误 - 读取初始化指针的数组
- 如何摆脱C ++中的分段错误错误?
- 使用 CTYPE 时出现分段错误
- 为什么代码给出分段错误?