Я пытаюсь запустить назначение программы 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;
}
Пробовали ли вы использовать отладчик? 'if (islower) else if (islower)'? – purplepsycho
использовать tolower и toupper вместо своих. –
Я не могу воспроизвести какую-либо проблему с './caesar 27', и там нет ничего, что могло бы вызвать segfault, если не будет нарушена функция' GetString', или вы забудете параметр (вы делаете 'atoi (argv [1] ]) 'перед проверкой существования' argv [1] '). – molbdnilo