尝试运行可执行文件

时间:2017-07-22 11:48:53

标签: c++ segmentation-fault

运行此时,您应该收到段错误。 它必须是在函数中错误使用私有类变量的东西。 只需编译它并尝试运行它。 此代码由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();
}

3 个答案:

答案 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));
}