Программа шифрования Цезаря на C

Я использую этот код для программы шифрования Цезаря. c = (альфа + k)% 26; // c = код ASCII зашифрованного текста, код ASCII алфавита "alpha", ключ k для зашифрованного текста; это уравнение дает мне ноль (0) на всех 26 алфавитах.

Спасибо!

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

int main (int argc, string argv[]) {

    // took key from user and converted it to int
    int k = atoi (argv[1]);

    // get plaintext from user
    string p = GetString ();

    int c = 0, alpha = 0;

    for (int i = 0, n = strlen(p); i < n; i++)
    {
        // if it is alphabet else if not alphabet
        if (isalpha (p[i]) == true) {

            // if it is capital case else lower case
            if (isupper(p[i]) == true) {
                alpha = p[i] - 65;

                // add key to plaintext then take modulas
                c = (alpha + k) % 26;

                alpha = c + 65;
            } else {
                alpha = p[i] - 97;

                // add key to plaintext then take modulas
                c = (alpha + k) % 26;

                alpha = c + 97;
            }

        } else {
            alpha = p[i];
        }

        printf("%c \n",  alpha);
    }
}

person Hodor    schedule 27.04.2016    source источник
comment
Вы используете C или C ++? Вы говорите C, но вы пометили как C ++.   -  person NathanOliver    schedule 27.04.2016
comment
Вы пробовали его отладить?   -  person Some programmer dude    schedule 27.04.2016
comment
И не имеет отношения к вашей проблеме, но постарайтесь избегать магических чисел , например, 65. Вместо этого используйте правильные символьные литералы, такие как 'A'.   -  person Some programmer dude    schedule 27.04.2016
comment
Интересно, никогда раньше не видел int main (int argc, string argv[]).   -  person kfsone    schedule 27.04.2016
comment
Неполный код. Возможно, ни у кого, кроме вашего класса, нет cs50.h. Без него ваш код не будет компилироваться.   -  person user4581301    schedule 27.04.2016
comment
@kfsone Согласен. Я подозреваю, что string - это макро-подстановка, спрятанная внутри cs50.h   -  person user4581301    schedule 27.04.2016
comment
@kfsone yes string и GetString - это функции библиотеки cs50.h.   -  person Hodor    schedule 27.04.2016
comment
cs50.h - это класс. Компилирую с ним на cloud 9 cs50 ide.   -  person Hodor    schedule 27.04.2016
comment
@JoachimPileborg Как мне использовать «A» вместо p [i] в ​​цикле.   -  person Hodor    schedule 27.04.2016
comment
Предупреждение по терминологии. cs50.h - это файл заголовка, а не класс. Помимо прочего, он может содержать класс. string не может быть функцией в зависимости от способа ее использования. В cs50.h скорее всего есть строчка что-то вроде #define string char *   -  person user4581301    schedule 27.04.2016
comment
Пример того, что предлагает Иоахим Пилеборг: alpha = p[i] - 65; будет alpha = p[i] - 'A';   -  person user4581301    schedule 27.04.2016
comment
@WeatherVane Весь этот код я написал сам. К сожалению, мой английский грамматически не очень хорош.   -  person Hodor    schedule 27.04.2016
comment
@ user4581301 Спасибо! Дай мне попробовать. Я дам тебе знать, что происходит.   -  person Hodor    schedule 27.04.2016
comment
@Saad мои извинения за недоразумение.   -  person Weather Vane    schedule 27.04.2016
comment
@ user4581301 Библиотека CS50 - это набор кода C, Ruby, PHP и Python, предназначенный для упрощения определенных задач, в частности ввода данных пользователем (для C) и аутентификации (для PHP, Python и Ruby). Источник: manual.cs50.net/library.   -  person Hodor    schedule 27.04.2016
comment
Также в магических числах вы можете заменить 97 на 'a'.   -  person Weather Vane    schedule 27.04.2016
comment
Он менее примитивен, чем я предполагал: typedef char* string; и отвечает на один из самых первых вопросов, заданных в комментариях. Это C, а не C ++. У вас здесь не будет занятий. Будьте осторожны, если вы используете этот заголовок с кодом C ++ и определенно не используете using namespace std;, иначе у вас будет конфликт имен между strings.   -  person user4581301    schedule 27.04.2016


Ответы (1)


Из документации isalpha

Каждая из этих подпрограмм возвращает ненулевое значение, если c - конкретное представление алфавитного символа.

Поэтому, когда вы говорите if (isalpha (p[i]) == true), вы сравниваете любое ненулевое значение, возвращаемое isalpha() (которое может быть не 1), с 1 (true) что может не выполняться, и этот блок if не будет выполнен. То же самое и с isupper(). Так что в основном я не думаю, что уравнение дает вам ноль, просто блок if, в котором находится уравнение, не выполняется.

Вы можете сделать:

if (isalpha(p[i])
{

   if (isupper(p[i])
   {
      //your code
   }
   ...//your code
}
person Biruk Abebe    schedule 27.04.2016
comment
Я никогда не использую дополнения типа bool к C, это одна из причин, почему. 0 ложно, все остальное верно. if (isalpha (p[i]) != false) излишне неуклюже, когда идиома языка if (isalpha (p[i])). - person Weather Vane; 27.04.2016
comment
@Weather Vane Именно! - person Biruk Abebe; 27.04.2016
comment
@kfsone, вы должны ответить. Это решило мою проблему. - person Hodor; 27.04.2016