2

さて、私はメッセージの暗号化と復号化プログラムを作ろうとしていました。では、なぜセグメンテーション違反が発生するのですか?誰かが私を助けてくれるなら、私はとても感謝しています!暗号化機能だけを実行していました。それは適切な結果を生み出しました。何が起こったのか手がかりはありますか?

        #include <iostream>
        using namespace std;
        #define max 1000
        #include <string.h>
        #include <cstdlib>
        #include <stdlib.h>
        #include <math.h>
        #include <stdio.h>


        char * encrypt(char *s)
        {
            int x = (rand()/((RAND_MAX+1u)/5));
            char *res;
            int ascii;
            switch(x)
            {
                case 0:
                for(int i=0;i<strlen(s);i++)
                {
                    ascii = (int)s[i];
                    ascii = ascii-19;
                    res[i+2] = (char)ascii;

                }
                res[0]='a';
                res[1]='$';
                break; 
                case 1:
                for(int i=0;i<strlen(s);i++)
                {
                    ascii = (int)s[i];
                    ascii = ascii+sqrt(strlen(s));
                    res[i+2] = (char)ascii;
                }
                res[0]='x';
                res[1]='&';
                break;
                case 2:
                case 3:
                for(int i=0;i<strlen(s);i++)
                {
                    ascii = (int)s[i];
                    ascii = ascii-sqrt(strlen(s));
                    res[i+2] = (char)ascii;
                }
                res[0]='z';
                res[1]='^';
                break;
                case 4: 
                for(int i=0;i<strlen(s);i++)
                {
                    ascii = (int)s[i];
                    ascii = ascii+13;
                    res[i+2] = (char)ascii;
                }
                res[0]='a';
                res[1]='j';
                break;
            }
            return res;


        }

        char * decrypt(char *s)
        {
            int ascii;
            char *res;
            if(s[0]=='a' &&s[1]=='$')
            {
                for(int i=0;i<strlen(s);i++)
                {
                    ascii = (int)s[i+2];
                    ascii += 19;
                    res[i] = ascii;
                }   
            }
            else if(s[0]=='b' &&s[1]=='&')
            {
                for(int i=0;i<strlen(s);i++)
                {
                    ascii = (int)s[i+2];
                    ascii -= (strlen(s)*strlen(s));
                    res[i] = ascii;
                }   
            }
            else if(s[0]=='z' &&s[1]=='^')
            {
                for(int i=0;i<strlen(s);i++)
                {
                    ascii = (int)s[i+2];
                    ascii +=(strlen(s)*strlen(s));
                    res[i] = ascii;
                }   
            }
            else if(s[0]=='a' &&s[1]=='j')
            {
                for(int i=0;i<strlen(s);i++)
                {
                    ascii = (int)s[i+2];
                    ascii -= 13;
                    res[i] = ascii;
                }   
            }

            return res;

        }


        int main()
        {
            int ch;
            int i=0;
            char *s;
            char *res;
            while(1) {

            cout<<endl<<"1.Encrypt\n2.Decrypt";
            cout<<endl<<"Choice: ";

            cin>>ch;
            switch(ch)
            {
                case 1: 
                cout<<"\nEnter a message: ";
                cin>>s;

                res=encrypt(s);
                cout<<"\nEncrypted message is: "<<res<<endl;
                break;

                case 2:
                cout<<"\nEnter an Encrypted message: ";
                cin>>s;

                res=decrypt(s);
                cout<<"\nDecrypted message is: "<<res<<endl;
                break; 
                default: exit(0);
            }
        }
            return 0;
        }

gdbは私にこのメッセージを与えます:

Starting program: /home/prasanna/encdec 

1.Encrypt
2.Decrypt
Choice: 1

Enter a message: Test Line

Program received signal SIGSEGV, Segmentation fault.
0xb7f41aab in std::basic_istream<char, std::char_traits<char> >& std::operator>><char,     std::char_traits<char> >(std::basic_istream<char, std::char_traits<char> >&, char*) ()
   from /usr/lib/i386-linux-gnu/libstdc++.so.6
4

3 に答える 3

7

直接の理由は、何かを読み込もうとする初期化されていないポインタchar *s;を宣言することです- 。cin>>s;

本当の理由は、Cコードを記述してC++と呼んでいることです。

于 2013-03-13T14:58:20.843 に答える
3

にメモリを割り当てていません

char *res;

しかし、あなたは

res[i+2] = (char)ascii;

そのメモリに書き込みます。これは未定義の動作であり、ほとんどの場合、クラッシュにつながります。

あなたはに同じことをしていmainますchar *s;

cin>>s;
于 2013-03-13T14:57:50.317 に答える
0

char* sメインにメモリを割り当てていません。入力として受け取った文字列を格納するスペースが決定されていません。一部の領域へのポインタを宣言しただけです(まだ決定されていません)

使用する std::string

またはあなたが使用することができますnew

char *s = new char[15];
于 2013-03-13T15:08:28.113 に答える