2017-07-22 7 views
-2

Lorsque vous exécutez cette opération, vous devez obtenir une erreur de segment. Ce doit être quelque chose avec une mauvaise utilisation des variables de classe privée dans la fonction. Juste le compiler et essayez de l'exécuter. Ce code a été édité par PaulMcKenzie!Erreur de segmentation lors de la tentative d'exécution de l'exécutable

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(); 
} 
+2

S'il vous plaît faire un [mcve]. – Yunnosch

+2

* L'erreur n'apparaît que lorsque vous essayez de l'exécuter. * - En d'autres termes, vous avez un bug. Une compilation réussie signifie uniquement qu'il n'y a pas d'erreurs de syntaxe. – PaulMcKenzie

+0

De quoi d'autre avez-vous besoin? Ne vous attendez pas à ce qu'il lance une erreur de compilation. Il ne fonctionnera pas une fois compilé. Le problème devrait être dans ces parties du code. Voyez-vous une erreur de segmentation ici? – alienCY

Répondre

1

std::string::operator[] ne fait pas la vérification des limites; std::string::at fait, et lève une exception si un accès hors-limites est tenté.

Vous parcourez la chaîne sans vérifier si elle reste à l'intérieur des limites de la chaîne. La boucle se termine uniquement si une nouvelle ligne (\n) est rencontrée. S'il n'y a pas de saut de ligne, alors il boucle jusqu'à ce qu'il atteigne les limites et ce qui se passe alors est indéfini.

Il y a un certain nombre de problèmes avec votre code. Pour un, ce n'est pas très C++ - ish. Vous devez utiliser foreach ou itérateurs ou (C++ 11 et suivantes) for(auto &…: …) pour implémenter les contraintes de boucle. Toute vérification sur une condition de fin devrait être extra; ils pourraient être mis dans la condition de boucle contrôle, mais il est généralement plus facile à lire de l'avoir comme un droit test si-break au début et avoir le repos après dans le corps de la boucle, comme ceci:

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

    … 
} 

Sur une note de côté: Cesar Ciphers ne sont pas vraiment du tout le cryptage. Il n'y a que 26 clés possibles. Cela seul serait assez facile à la force brute, mais étant donné un texte chiffré assez long, vous n'avez même pas à faire cela: Il suffit de déterminer les fréquences des lettres dans le texte chiffré, de les trier, d'associer les fréquences de lettres la langue supposée. Pour un simple chiffre de rotation sur un caractère latin, vous pouvez regarder la lettre la plus haute fréquence et supposer que c'est un e, vous donnant la clé.

+0

Je travaille sur un projet sur les chiffrements classiques: https://github.com/alienCY/CEDA – alienCY

1

Ne pas tester sur certains terminaison car. A std :: string connaît sa taille

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

Merci pour l'aide des gens! : D Je vais essayer d'apprendre à déboguer dans vim et en apprendre plus sur les chaînes. Pour l'instant, j'ai utilisé pour chaque boucle pour réparer mon erreur stupide de faire une boucle infinie (?) Et accéder à des adresses de mémoire que je n'aurais pas dû accéder.

C'est le code de la fonction qui fonctionne:

m_decryptedText = m_text; 

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