Я новичок в кодировании и занимаюсь этим пару недель.Сейчас я беру курс cs50, и я написал код для pset2 vigenere.Когда я использовал check50, я понял, что он хочет, чтобы я учитывал пробелы и не буквы, не пропуская ключ вперед.
Я добавил "j--;"и, хотя код верен, теперь он создает дополнительные случайные символы в конце зашифрованного текста.
Кроме того, при проверке argv [1] только для букв в моем коде, у меня есть оператор if, который имеет "int key = argv [1] [i];"в теле.Он ничего не делает, но я не знаю, как заставить его продолжать проверять следующий символ, не имея пустого тела, что недопустимо.
Любая помощь будет принята с благодарностью!Большое спасибо!
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(int argc, string argv[0])
{
//making sure it is not more than one command line
if (argc != 2)
{
printf("Usage: ./vigenere key \n");
return 1;
}
//if it is one command line, making sure the input is just letters
if (argc == 2)
{
for (int i = 0, n = strlen(argv[1]); i < n; i++)
{
if (isalpha(argv[1][i]))
{
int key = argv[1][i];
}
else
{
printf("Usage: ./vigenere key \n");
return 1;
}
}
}
//asking user for input text
string plaintext = get_string("plaintext: ");
printf("ciphertext:");
//going through a loop to turn plain text into ciphertext
int i = 0;
int n = strlen(plaintext);
string key = argv[1];
//looping through the key
while (i < n)
{
for (int j = 0, m= strlen(key); j < m; j++, i++)
{
//using the asci of each char as an int
int asc = (plaintext[i]);
int k = key[j];
//if lowercase
if (k >= 97 && k <= 122)
{
k -= 97;
}
else
{
k -= 65;
}
//if lowercase
if (asc >= 97 && asc <= 122)
{
printf("%c", ((((asc - 97) + k) % 26) + 97));
}
//if uppercase
else
{
if (asc >= 65 && asc <= 90)
{
printf("%c", ((((asc - 65) + k) % 26) + 65));
}
//if non-letter
else
{
printf("%c", asc);
j--;
}
}
}
}
printf("\n");
}
Это ожидаемые и фактические результаты:
key: baz
plaintext: hello, world!
expected ciphertext: iekmo, vprke!
actual ciphertext: iekmo, vprke!!pu