2014-12-15 3 views
2

Я делаю простую программу шифрования/дешифрования ... Я новичок.C++ cin.getline() вызывает сбой программы

#include <time.h> 
#include <stdlib.h> 
#include <iostream> 
#include <string> 

using namespace std; 

char s[1025]; 
char o[1025]; 
char key[1025]; 

char tochar(int a) 
{ 
    if(a<26) return 'a'+a; 
    if(a>25 and a<52) return 'A'+a-26; 
    if(a>51) return '0'+a-52; 
} 
int toint(char t) 
{ 
    if(t>='a' and t<='z') return 0-'a'+t; 
    if(t>='A' and t<='Z') return 26+t-'A'; 
    if(t>='0' and t<='9') return 52+t-'0'; 
} 

int main() 
{ 
    int i,j,keylenght; 
    //for(j=0;j<62;j++)cout<<j<<" "<<tochar(j)<<" "<<toint(tochar(j))<<endl; 
    cout<<"Enter String:\n"; 
    cin.getline(s,1024); 
    cout<<"Function [encrypt/decrypt]: "; 
    char f; 
    cin>>f; 
    if(f=='e') 
    { 
     cout<<"Generate key? [y/n]: "; 
     cin>>f; 
     if(f=='y') 
     { 
      cout<<"Enter key length [up to 1024]: "; 
      cin>>keylenght; 
      srand(time(0)); 
      for(i=0;i<keylenght;i++) 
      { 
       key[i]=tochar(rand()%62); 
      } 
     } 
     else 
     { 
      cout<<"Enter key: \n"; 
      cin.getline(key,1024); 
      for(keylenght=0;key[keylenght]!='\0';keylenght++); 
     } 

     for(i=0;s[i]!='\0';i++) 
     { 
      if(key[keylenght%i]!=' ') 
      { 
       if(s[i]!=' ')o[i]=tochar((toint(s[i])+toint(key[i%keylenght]))%62); 
       else o[i]=' '; 
      } 
      else 
      { 
       o[i]=s[i]; 
      } 
     } 
     cout<<endl<<"Encrypted string: "<<o<<endl<<"Generated key: "<<key; 
    } 
    else 
    { 
     cout<<"Enter key: "; 
     cin>>key; 
     for(keylenght=0;key[keylenght]!='\0';keylenght++); 
     for(i=0;s[i]!='\0';i++) 
     { 
      if(s[i]!=' ') 
      { 
       if(key) o[i]=tochar((62+toint(s[i])-toint(key[i%keylenght]))%62); 
      } 
      else o[i]=' '; 
     } 
     cout<<endl<<"Decrypted string:\n"<<o; 
    } 
    return 0; 
} 

В первый раз, когда я использую getline(), он работает безупречно. Однако, когда я пытаюсь использовать его для записи в строке [], это приводит к сбою программы.

Может ли кто-нибудь сказать мне, что происходит?

+0

В какой строке он работает? – Dennis

+0

Строка 51. 'cin.getline (key, 1024);' –

+0

'if (key [keylenght% i]! = '')' Не будет работать, когда 'i' равно нулю (что находится в очень первая итерация цикла). Возникает арифметическое исключение для по модулю к нулю. Я действительно не смотрел на ваших подозреваемых в получении, потому что это сразу же спрыгнуло на меня. Довольно уверен, что вы хотите 'i% keylength' там. После этого ваша 'toint' функция ужасно предположена. – WhozCraig

ответ

1

Проблема в том, что вы смешиваете свои типы ввода. Когда вы позвоните

cin>>f; 

Это оставляет новую строку во входном буфере. Затем на ваш вызов getline() будет добавлена ​​только новая строка. Что нужно сделать, так это очистить входной буфер перед вызовом getline. Я хотел бы использовать:

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n') 
0

Не используйте istream::getline(), используйте std::getline() вместо этого. Это безопаснее.

Смежные вопросы