2013-02-19 5 views
-1

Я следую за университетом iTunes: лекции в Гарварде CS50, чтобы изучить основы программирования. В настоящее время я пытаюсь создать программу для текстового cypher. Вот код для всей программы.C: Функция выполняется по-разному в отдельных экземплярах

#include<stdio.h> 
#include<cs50.h> 
#include<stdlib.h> 
#include<string.h> 

int cyphmain (void); 
int decyphmain (void); 
int maincalc (int k); 
int dmaincalc (int k); 
int uppercalc (int u, int k); 
int lowercalc (int u, int k); 
int duppercalc (int u, int k); 
int dlowercalc (int u, int k); 

int 
main(void)         //Main Function begins by asking the user if he would like to Cypher or Decypher his text 
{ 
    char h; 
    printf("Do You Want Cypher(c) or Decypher(d)?:"); 
    scanf("%c",&h);      
    if (h==99)        //Checks ascii of "c"(99) and runs the cypher main function 
     cyphmain(); 
    else if (h==100)      //Checks ascii of "d"(100) and runs the decypher main function 
     decyphmain();     
    else 
     return 0; 
} 

int cyphmain (void)       //Cypher Main Function 
{ 
    int k; 
    printf("What is the Cypher Number:"); //Gets the rot number 
    scanf("%d",&k); 
     if (k>25)       //Ensures that the User only choses a number from 1-25 
     { while (k>25)     //Continues to ask user for a number until they input a value <=25 
      { 
       printf("Sorry Please Choose A Number from 1-25 only:"); 
       int l=GetInt(); 
       k=l; 
      } 
      maincalc(k);     //as soon as a valid input is received maincalc function is run 
     }  
     else        //in this case a valid input has been recieved and maincalc runs 
      maincalc(k); 
    return 0;  
} 

int decyphmain (void)      //Decypher Main Function 
{ 
    int k; 
    printf("What is the Cypher Number:"); //Gets the rot number 
    scanf("%d",&k); 
     if (k>25)       //Ensures that the User only choses a number from 1-25 
     { while (k>25)     //Continues to ask user for a number until they input a value <=25 
      { 
       printf("Sorry Please Choose A Number from 1-25 only:"); 
       int l=GetInt(); 
       k=l; 
      } 
      dmaincalc(k);     //as soon as a valid input is received maincalc funtion is run 
     }  
     else        //in this case a valid input has been recieved and maincalc runs 
      dmaincalc(k); 
     return 0; 
} 

int maincalc(int k)       //The Calculation Function for Cyphering 
{ 
    char *s; 
    printf("Please enter the phrase that you would like to code:"); 
    scanf("%s",&s); 
    int i=0; 
    int n=strlen(s); 

    while(i<n) 
    { 
     if(s[i]>=65&&s[i]<=90)    //For Uppercase letters 
     { 
      int u=s[i]; 
      int c=uppercalc(u,k);   //Hands off the character to a function to cypher Upper Case Letters 
      printf("%c",c); 
     } 
     else if(s[i]>=97&&s[i]<=122)  //For Lowercase letters 
     { 
      int u=s[i]; 
      int c=lowercalc(u,k);   //Hands off the character to a function to cypher Lower Case Letters 
      printf("%c",c); 
     } 
     else 
      printf("%c",s[i]);    //For non letters 
     i++; 
    }  
    printf("\n"); 
    return 0; 
} 


int uppercalc(int u, int k)     //Algorithm used to cypher Upper Case  letters 
{ 
    if(u+k<=90) 
    { 
     int c=u+k; 
     return (c); 
    } 
    else 
    { 
     if (((u+k)/26)==3) 
     { 
      int c=((u+k)%26)+52; 
      return (c); 
     } 
     else 
     { 
      int c=((u+k)%26)+78; 
      return (c); 
     } 
    } 
} 

int lowercalc(int u, int k)     //Algorithms used to Cypher lower case  letters 
{ 
    if(u+k<=122) 
    { 
     int c=u+k; 
     return (c); 
    } 
    else 
    { 
     if (((u+k)/26)==4) 
     { 
      int c=((u+k)%26)+78; 
      return (c); 
     } 
     else 
     { 
      int c=((u+k)%26)+104; 
      return (c); 
     } 
    } 
} 

int dmaincalc(int k)       //The Calculation Function for Decyphering 
{ 
    char *s; 
    printf("Please enter the phrase that you would like to decode:"); 
    scanf("%s",&s); 
    int i=0; 
    int n=strlen(s); 

    while(i<n) 
    { 
     if(s[i]>=65&&s[i]<=90)    //For Uppercase letters 
     { 
      int u=s[i]; 
      int c=duppercalc(u,k); 
      printf("%c",c); 
     } 
     else if(s[i]>=97&&s[i]<=122) //For Lowercase letters 
     { 
      int u=s[i]; 
      int c=dlowercalc(u,k); 
      printf("%c",c); 
     } 
     else 
      printf("%c",s[i]);   //For non letters 
     i++; 
    }  
    printf("\n"); 
    return 0; 
} 

int duppercalc(int u, int k)    //Algorithm to decypher Upper Case letters 
{ 
    if(u-k>=65) 
    { 
     int c=u-k; 
     return (c); 
    } 
    else 
    { 
     if (((u-k)/26)==2) 
     { 
      int c=((u-k)%26)+78; 
      return (c); 
     } 
     else 
     { 
      int c=((u-k)%26)+52; 
      return (c); 
     } 
    } 
} 

int dlowercalc(int u, int k)    //Algorithms to decypher lower case letters 
{ 
    if(u-k>=97) 
    { 
     int c=u-k; 
     return (c); 
    } 
    else 
    { 
     if (((u-k)/26)==3) 
     { 
      int c=((u-k)%26)+104; 
      return (c); 
     } 
     else 
     { 
      int c=((u-k)%26)+78; 
      return (c); 
     } 
    } 
} 

Программа начинается с запросом пользователя, хочет ли он Cypher или дешифратора, вставляя либо обугленный «с» или «D» и работает либо функции в cyphmain (если шифрование) или dcecyphmain (если decphering). Это прекрасно работает

Затем программа запрашивает у пользователя номер гнили, а затем просит пользователя ввести фразу. Это также отлично работает.

Однако после ввода слов в (de) cypher программа вылетает с ошибкой сегментации, что заставляет меня полагать, что ошибка заключается в функциях maincalc/dmaincalc. (Обратите внимание, что по существу две копии каждой функции для шифрования, а другая для дешифрования, они точно такие же, за исключением нескольких изменений в тексте и фактической математики, участвующих в шифровании или дешифровке текста).

Вот пример ошибки

Do You Want Cypher(c) or Decypher(d)?:d 
What is the Cypher Number:2 
Please enter the phrase that you would like to decode: Hello 
Segmentation fault (core dumped) 
+0

Используйте Valgrind, чтобы найти номер строки, где он падает. –

+0

Вы не выделили место для строки ни в стеке, ни в куче. – cha0site

+0

И аргумент для 'scanf' должен быть' char * 'с преобразованием'% s', поэтому 'scanf («% s », s)» вместо 'scanf («% s », & s)» (после выделения). –

ответ

0

Ваша ошибка здесь:

char *s; 
printf("Please enter the phrase that you would like to code:"); 
scanf("%s",&s); 

Это не выделяет место для строки. Вы можете использовать malloc для выделения пространства или поместить строку в стек.

char *s = malloc(sizeof(char) * 50); /* option 1*/ 
char s[50]; /* option 2 */ 

Для варианта 1, обратите внимание, что sizeof(char) всегда 1, я просто положить, что для полноты картины. Также не забывайте, что вам нужно позвонить free(s), когда закончите со строкой.

+0

Хорошо, это работает, но проблема в том, что строка будет записывать только одно слово. Фраза, такая как «Hello World», кодирует только Hello, но не мир. Что мне нужно сделать, чтобы заставить строку читать все слова, а не только первую? – shea

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

  • Нет связанных вопросов^_^