Как aceder в аргументы argv [1] в таблице?

Я делаю код Vigenere, что - обобщение кода Цезаря с перемещением, которое меняется из-за каждой буквы текста, которую нужно шифровать. Это из-за того, что говорит, каждая буква текста с кодом Американский стандартный код обмена информацией ci я она изменю в ci = (pi + kj) % 26.

Он работает как это:

./vigenere bacon
que esta el texto a cifrar
Meet me at the park at eleven am
Negh zf av huf pcfx bt gzrwep oz

Однако, если он был способен шифровать с кодом Цезаря, у меня есть трудности с кодом Vigenere. encoriación очень особенный и не дает буквы:

:~/workspace/pset2 $ ./vigenere bacon
Que esta ek texto a cifrar?
Meet me at the park at eleven am
m@T @ � T@  � @  

Здесь - мой код:

#include 
#include 
#include 
#include 
#include 


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

    string key = argv[1];

    printf("What is the text to be encrypted?\n");
    string s = GetString();
    int encryptedASCII[strlen(s)];

    for (int i = 0, o = strlen(s); i < o; i++)
    {
        if(i==o)
        {
            break;
        }

        for (int j = 0, p = strlen(key); j < p; j++)
        {
            if (isalpha(s[i]))
            {
                if(isupper(s[i]))
                {

                    encryptedASCII[i] = (((s[i] - 'A') + key[j])%26) + 'A';
                    if(j==p)
                    {
                        j=0;
                    }

                }

                if(isupper(s[i]))
                {

                    encryptedASCII[i] = (((s[i] - 'a') + key[j])%26) + 'a';
                    if(j==p)
                    {
                        j=0;
                    }

                }
            }

            else
            {
                encryptedASCII[i]=s[i];
                //j--;
            }

        }

    }

    //here we are displaying the encrypted text 
    for (int i = 0, n = strlen(s); i < n; i++)
    {
        printf("%c", encryptedASCII[i]);
    }
    printf("\n");

    return 0;

}

Я думаю, что ошибка здесь: string key = argv[1]; Я хочу создать таблицу с буквами ключа криптографии, которая меняется из-за каждой буквы, которую нужно шифровать.

Я думаю, что нужно соглашаться на буквы, которые уже в key[j] (что, однако, пошел declardo как string key = argv[1];). Но уже я не знаю, как соглашаться на код Американский стандартный код обмена информацией буквы в таблице...

введенный в курс

Итак, я принес идею eferion, меняю циклы for и applicacion ключа в буквы с этой формулой: + key[i%strlen(key)])%26

El nuevo codigo esta:

#include 
#include 
#include 
#include 
#include 


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

    char* key= argv[1];
    /*int ASCIIvalue[strlen(key)];

    for (int u = 0, q = strlen(key); u < q; u++)
    {
        ASCIIvalue[u]=key[u];
    }*/

    printf("What is the text to be encrypted?\n");
    string s = GetString();
    int encryptedASCII[strlen(s)];

    for (int i = 0, o = strlen(s); i < o; i++)
    {
        if(i==o)
        {
            break;
        }

        char ckey = key[i%strlen(key)];
        int Ikey;
        if(isupper(key[i%strlen(key)]))
        {
            Ikey= ckey -'A';
        }
        else if(islower(key[i%strlen(key)]))
        {
            Ikey = ckey -'a';
        }

        if (isspace(s[i]))
        {
                        encryptedASCII[i]=s[i];
        }

        else if (isalpha(s[i]))
        {

            if(isupper(s[i]))
            {
            //char ckey = key[i%strlen(key)];
            encryptedASCII[i] = ((s[i] - 'A' + Ikey) % 26) + 'A';

            }

            if(islower(s[i]))
            {
            //char ckey = key[i%strlen(key)];
            encryptedASCII[i] = ((s[i] - 'a' + Ikey) % 26) + 'a';
            }
        }

        else
        {
            encryptedASCII[i]=s[i];
            //j--;
        }

    }

    //here we are displaying the encrypted text 
    for (int i = 0, n = strlen(s); i < n; i++)
    {
        printf("%c", encryptedASCII[i]);
    }
    printf("\n");

    return 0;

}

Восток функционирует до первого места, что, жаль, имелся в виду, что прокручивает encriptación.

$ ./vigenere bacon
What is the text to be encrypted?
Meet me at the park at eleven am   
Tegh ne og tjs qaty bt syfvgb bm

но должен будь быть:

Negh zf av huf pcfx bt gzrwep oz

Действительно, мы должны отделять переменную i переменной, которая гуляет по ключу

0
задан 03.06.2016, 15:43
2 ответа

Нужно начинать тем, что говорит, что string это прозвище char* определенный в книжном магазине cs50.h.

char это целое число 8 бит, которые составитель переводит в символе используя таблицу Американский стандартный код обмена информацией, но действительно - число и из-за этого ты можешь реализовывать математические операции с. Если ты хочешь отобразить число, которое есть сзади, ты можешь optaro из-за того, что это конвертируешь в int.

int ASCIIvalue = key[i];

введенная в курс

Твоя новая версия страдает несколькими проблемами

if (isalpha(s[i]))
{
  if(isupper(s[i]))
  {
    encryptedASCII[i] = (((s[i] - 'A') + key[i%strlen(key)])%26) + 'A';
  }

  if(isupper(s[i]))
  {
    encryptedASCII[i] = (((s[i] - 'a') + key[i%strlen(key)])%26) + 'a';
  }
}

Второй условный не был бы должен быть islower?

С другой стороны ты понимаешь, что ключ будет являться в прописных буквах... Что происходит, если пользователь вводит часть ключа в строчные буквы?

Может быть, самое простое состояло в том, чтобы конвертировать как ключ, так и ввод пользователя под прописные буквы и после бросать единственный процесс криптографии:

void toUpper(char* ptr)
{
  for(; ptr!=0; ++ptr)
    *ptr = toupper(*ptr);
}

int main(int argc, char** argv)
{
  char* key= argv[1];
  toUpper(key);

  printf("What is the text to be encrypted?\n");
  char s[100];
  scanf("%s",s);
  toUpper(s);

  int encryptedASCII[strlen(s)];

  for (int i = 0, o = strlen(s); i < o; i++)
  {
    if (isalpha(s[i]))
    {
      char ckey = key[i%strlen(key)];
      encryptedASCII[i] = ((s[i] - 'A' + ckey) % 26) + 'A';
    }
    else
      encryptedASCII[i]=s[i];
  }

  //here we are displaying the encrypted text 
  printf("%s\n", encryptedASCII);
}

Другая альтернатива состояла бы в том, чтобы обращать характер ключа в прописные буквы / строчные буквы таким образом что он совпал с символом, который было нужно шифровать, но эта версия прокручивает изображение в окне твоего счета.

Приветствие.

2
ответ дан 24.11.2019, 14:15
  • 1
    Большое спасибо! Тогда я написал: char* key = argv [1]; 'char* key = argv [1]; int ASCIIvalue [strlen (key)]; for (int или = 0, q = strlen (key); или < q; или ++) {ASCIIvalue [или] =key [или];}' И я меняю формулу: encryptedASCII[i] = (((s[i] - 'A') + ASCIIvalue[j])%26) + 'A';, Но всегда у меня есть очень дополнительный output и # 241; или: $ ./vigenere bacon What is the text to be encrypted? Meet me at the park at eleven am m �� �� n @W –  IggyPass 01.06.2016, 15:40
  • 2
    Если у key есть длина 5, и ты пробуешь шифровать сообщение длины 15 est и # 225; ясно, что ты не будешь мочь делать key[6]. и #191; Ты попытался с key[j%strlen(key)]? –  eferion 01.06.2016, 16:01
  • 3
    Если, он неважен. Но я хочу, что key повторяется, когда он заканчивается. и #191; Захоти, что в и # 241; ado новый код? –  IggyPass 01.06.2016, 16:22
  • 4
    Это само - то, что стремится к тому, чтобы сделать м и # 243; dulo в c и # 243; я говорю моего предыдущего комментария... –  eferion 01.06.2016, 16:24
  • 5
    Я понял и в и # 241; adido новый c и # 243; я говорю –  IggyPass 02.06.2016, 11:18

Большое спасибо в enferion из-за всей помощи, здесь эта cГіdigo Vigenere, который функционирует с minГєculas и mayГєsculas, и имейте в виду место

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


int main(int argc, string argv[])
{
    int j= 0;
    char* key= argv[1];

    printf("What is the text to be encrypted?\n");
    string s = GetString();
    int encryptedASCII[strlen(s)];

    for (int i = 0, o = strlen(s); i < o; i++)
    {

        if(i==o)
        {
            break;
        }


        if (isalpha(s[i]))
        {
            char ckey = key[(j%strlen(key))];
            int Ikey;
            if(isupper(key[j%strlen(key)]))
            {
                Ikey= ckey -'A';
                j++;
            }
            else if(islower(key[j%strlen(key)]))
            {
                Ikey = ckey -'a';
                j++;
            }

            if(isupper(s[i]))
            {
            //char ckey = key[i%strlen(key)];
            encryptedASCII[i] = ((s[i] - 'A' + Ikey) % 26) + 'A';

            }

            if(islower(s[i]))
            {
            //char ckey = key[i%strlen(key)];
            encryptedASCII[i] = ((s[i] - 'a' + Ikey) % 26) + 'a';
            }
        }

        else
        {
            encryptedASCII[i]=s[i];
            //j--;
        }

    }

    //here we are displaying the encrypted text 
    for (int i = 0, n = strlen(s); i < n; i++)
    {
        printf("%c", encryptedASCII[i]);
    }
    printf("\n");

    return 0;

}
0
ответ дан 24.11.2019, 14:15