Почему я получаю ошибку сегментации, когда беру строковый ввод?
Ну, я пытался сделать программу шифрования и дешифрования сообщений. Итак, почему я получаю ошибку сегментации? Если кто-нибудь может помочь мне, я буду очень, очень благодарен! Я запустил только функцию шифрования. Это дало правильные результаты. Любая подсказка, что случилось?
#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
3 ответа
Непосредственная причина в том, что char *s;
объявляет неинициализированный указатель, в который вы пытаетесь что-то прочитать - cin>>s;
,
Настоящая причина в том, что вы пишете код на C и называете его C++.
Вы не выделили память
char *res;
но ты
res[i+2] = (char)ascii;
напиши в эту память. Это неопределенное поведение, которое чаще всего приводит к сбою.
Вы делаете то же самое в main
в char *s;
:
cin>>s;
Вы не выделили никакой памяти char* s
в основном. Нет места для хранения строки, которую вы получили в качестве входных данных. Вы только что объявили указатель на некоторую область (которая еще не определена)
использование std::string
или вы можете использовать new
char *s = new char[15];