2016-12-11 8 views
0

При запуске, как указано выше, программа показывает ошибку сегментации. Почему это так? Программа предназначена для шифрования vigenere. То, что я делаю, это хранить ключ в строке, а затем хранить целочисленное значение ключа, как мы делали в кезар-шифре, а затем внедрять шифр vigenere, но как-то он показывает ошибку сегментации, если я его компилирую, а затем используя ./a.out бекон. Я не могу понять, почему это происходит (что вызывает ошибку сегментации).Что вызывает возникновение ошибки сегментации?

#include<stdio.h> 
#include<cs50.h> 
#include<string.h> 
#include<ctype.h> 
#include<stdlib.h> 
int main(int argc, string argv[]) 
{ 
    if((argc==2)&&(isalpha(argv[1]))) 
    { 
     string k; 
     k=argv[1]; 
     string p = GetString(); 
     int lenkey=strlen(k); 
     int lenp=strlen(p); 
     string c="hello"; 
     char temp; 

     //change key to lowercase and store the shift value as in caesar 
     for(int i=0;i<lenkey;i++) 
     { 
      temp=tolower(k[i]); 
      k[i]=temp -'a'; 

     } 
     int j=0; 
     for(int i=0;i<lenp;i++) 
     { 
      //i is for plaintext j is for key 
      if(isalpha(p[i])) 
      { 
       j++; 
       if(j==(lenkey-1)) j=0;//reset the key if end is reached 
       if(isupper(p[i])) 
       { 
        p[i] = p[i]-'A'; 
        c[i] = (p[i]+k[j])%26; 
        c[i] = c[i]+'A'; 
       } 
       if(islower(p[i])) 
       { 
        p[i] = p[i]-'a'; 
        c[i] = (p[i]+k[j])%26; 
        c[i] = c[i]+'a'; 
       } 
      } 
      else 
       c[i]=p[i]; 
     } 

     printf("%s\n",c); 
     return 0; 
    } 
    else 
    { printf("what?\n"); 
     return 1; 
    } 
} 
+2

'string'? Я предполагаю, что это в 'cs50.h', поскольку он не существует ни в одном из других (стандартных) заголовков. поэтому ваш код мог бы, буквально, делать что угодно! * – paxdiablo

+0

'string' -' typedef char * string', который входит в заголовочный файл 'cs50' – 4rshdeep

+0

Итак, что дает' GetString() 'дать вам? – paxdiablo

ответ

0

О atoi: «возвращает INT значения производится путем интерпретации вводимых символов как число Возвращается значение 0, если вход не может быть преобразован в значение этого типа..»

Таким образом, ваш atoi(c) -'a' завершится с ошибкой и произведет отрицательное число (c, являющееся строкой «привет», которая не может быть интерпретирована как число).

Возможно, вы имели в виду:

 temp=tolower(k[i]); 
     k[i]=temp -'a'; 


также следующее может быть ошибка:

for(int i=0;i<lenp;i++) { 
     ... 
     c[i] = c[i]+'A'; 

i<lenp, потому что, но это должно быть <, чем длина c, которая 5.

Кроме того, char *c="hello" делает ca постоянной строкой (буквально), и вы не можете изменить литерал. Следовательно: seg fault. Использование:

char c[]="hello"; 

(все, в том числе учителей:! Капля что string это сбивает с толку всех)

+0

, даже после редактирования показывает ошибку сегментации. – 4rshdeep

+0

Используйте отладчик для проверки _where_, который сбой. Может быть больше ошибок, чем только этот. –

+0

Поттершер, см. Мое редактирование. –