2016-07-04 6 views
-3

Я пытаюсь запустить назначение программы caesar.c из edx Введение в программирование. Для этого требуется программа, способная шифровать строку с помощью шифрования Caesar: поэтому пользователь должен ввести ключ (командная строка); например, с ключом 2 символа 'A' необходимо зашифровать символом 'C'; проблема начинается, когда вам нужно ввести ключ, превышающий 26, что является числом алфавитных букв. Например, для ключа из 27 и символа «A» программа должна вернуть «B», например, ключ 1.Застрял с Caesar.c

Я попытался преобразовать значения ASCII символов в алфавитном порядке от 0 до 26 дюймов чтобы использовать оператор модуля, когда ключ равен или больше 26. Он возвращает мне ошибку сегментации. Может ли кто-нибудь помочь мне с некоторыми предложениями о причинах моей ошибки?

Вот программа:

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

int key; 

// function for an alphabetic value with non capital letters 

int alpha_low(char c) 
{ 
    int alpha_value; 
    alpha_value = (int) c - 97; 
    return alpha_value + (key % 26); 
} 

// function to return to ascii valuee for non capital letters 

char ascii_low(char c) 
{ 
    return (char) alpha_low(c) + 97; 
} 

// function for an alphabetic value with capital letters 

int alpha_up(char c) 
{ 
    int alpha_value; 
    alpha_value = (int) c - 65; 
    return alpha_value + (key % 26); 
} 

// function to return to ascii value for capital letters 

char ascii_up(char c) 
{ 
    return (char) alpha_up(c) + 65; 
} 


int main(int argc, string argv[]) 
{ 
     int result; 
     string p; 
     key = atoi(argv[1]); 

    if(argc != 2 || key < 0) 
    { 
     printf("Usage: ./caesar key(positive integer)\n"); 
     return 1; 
    } 

    printf("Please, write a plaintext: "); 
    p = GetString(); 

    for(int i = 0, n = strlen(p); i < n; i++) 
    { 
     if (isalpha(p[i])) 
     { 
      if (islower(p[i])) 
      { 
      result = alpha_low(p[i]); 
      printf("%c", ascii_low(p[i])); 
      } 
      else if(islower(p[i])) 
      { 
       result = alpha_up(p[i]); 
       printf("%c", ascii_up(p[i])); 
      } 
     } 
    }  

    return 0; 
} 
+2

Пробовали ли вы использовать отладчик? 'if (islower) else if (islower)'? – purplepsycho

+0

использовать tolower и toupper вместо своих. –

+1

Я не могу воспроизвести какую-либо проблему с './caesar 27', и там нет ничего, что могло бы вызвать segfault, если не будет нарушена функция' GetString', или вы забудете параметр (вы делаете 'atoi (argv [1] ]) 'перед проверкой существования' argv [1] '). – molbdnilo

ответ

2

Функция кесарево буквенный символ должен быть как (с разложением в элементарных шагов):

int caesar_lower(int c,int key) { 
    int v = c-'a'; // translate 'a'--'z' to 0--25 
    v = v+key;  // translate 0--25 to key--key+25 
    v = v%26;  // translate key--key+25 to key--25,0--key-1 
    v = v+'a';  // translate back 0--25 to 'a'--'z' 
    return v; 
} 
+0

Спасибо. Ваша функция выполняет синтаксис моих двух функций, но когда я запускаю программу, она возвращает только зашифрованные зашифрованные символы, тогда как заглавные буквы не печатаются, и между словами нет пробела. У вас есть предложения по улучшению моего кода? Я честно не знаю, почему он не принимает во внимание заглавные буквы –

+0

Я решил для космической проблемы (довольно глупая проблема на самом деле) ... нужно только понять, почему функция caesar_upper не активирует –

+0

, потому что вы использовали дважды тот же тест 'if (islower())' ... заменить на 'if (islower()) else else if (isupper())' ... –