Шифрование текста работает только для нижнего регистра, буквы верхнего регистра остаются неизменными

#c

#c

Вопрос:

Я работаю над pset, и мне нужна помощь. Цель программы — принять аргумент командной строки и использовать его в качестве ключа для шифрования некоторого открытого текста, введенного пользователем, и сдвинуть его на количество заданных букв. Прописные буквы должны оставаться прописными, строчные — строчными. Все остальные символы должны оставаться неизменными. Мой код шифрует только буквы нижнего регистра, но не верхний регистр. Пожалуйста, помогите мне понять, почему.

  void encryption(string plaintext, int k, string ciphertext);
    int main(int argc, string argv[])
    {
        string plaintext;
        int n = strlen(plaintext);
        char ciphertext[n 1]; //the lenght of the plaintext  1 extra char which i
        int k = atoi(argv[1]); //Convert string into an integer, i.e parsing
    
    
        if (argc != 2)
        {
           printf("Usage: ./caesar keyn");
            return 1;
        }
        else
        {
    
     
            for (int i = 0, m = strlen(argv[1]); i < m; i  )
        {
        if (isdigit(argv[1][i]))
          {
     plaintext = get_string("Plaintext:");
     encryption(plaintext, k, ciphertext); //calling the encryption function
       printf("Ciphertext: %sn", ciphertext);
       return 0;
    
          }
    
       else
       {
          printf("Usage: ./caesar keyn");
            return 1;
       }
    
            }
        }
    }
    void encryption(string plaintext, int k, string ciphertext)
    {
    
        for (int i = 0, n = strlen(plaintext); i < n; i  )
        {
            if (isupper(plaintext[i]))
            {
                int  pi = plaintext[i] - 65;
                char ci = ((pi   k) % 26)   65;
                ciphertext[i] = ci;
            }
    
            if (islower(plaintext[i]))
            {
                int pi1 = plaintext[i] - 97;
                char ci1 = ((pi1   k) % 26)   97;
                ciphertext[i] = ci1;
            }
            else
            {
                ciphertext[i] = plaintext[i];
            }
    
        }
    }
 

Комментарии:

1. Здесь: else { ciphertext[i] = plaintext[i]; } где вы изменили его обратно на обычный текст. Приведенный выше тест if (islower(plaintext[i])) должен быть else if (islower(plaintext[i])) . Я думаю, вы имели в виду: если это прописные буквы, иначе , если это строчные, иначе простые.

2. Большое вам спасибо. Теперь это работает.

3. Рассмотрите возможность именования функций с использованием глаголов, а не существительных. Функции что-то делают , и на языке мы описываем это с помощью глагола. Если вы сохраняете некоторую согласованность с обычным языком в своей программе, его становится легче читать и понимать. Особенно по мере усложнения кода.

4. Спасибо, Пэдди. Я буду делать это с этого момента.