#c #command-line-arguments #cs50 #caesar-cipher
#c #аргументы командной строки #cs50 #caesar-cipher
Вопрос:
Я писал код для Caesar’s cypher (кодирование букв путем сдвига их на введенное число). Он работал правильно, пока я не ввел условие, гарантирующее, что введенный ключ является цифрой и каким-то образом нарушает работу кода.
Я не понимаю, как это условие впоследствии соотносится с кодом и что не так.
Не мог бы кто-нибудь помочь?
#include <stdio.h>
#include <cs50.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main(int argc, string argv[])
{
if (argc != 2)
{
printf("Usage: ./caesar keyn");
return 1;
}
for (int j = 0; j < strlen(argv[1]); j )
{
if (!(isdigit(argv[1][j])))
{
printf("Usage: ./caesar keyn");
return 1;
}
}
int k = atoi(argv[1]);
if (argc == 2 amp;amp; k > 0)
{
string s = get_string("plaintext: ");
int m = k % 26;
//introducing an array type char of string length size
char cypher[strlen(s)];
for (int i = 0; i < strlen(s); i )
{
//checking if it's a letter, if yes then next if
if (isalpha(s[i]))
{
//checking if it's uppercase
if (isupper(s[i]))
{
cypher[i] = (s[i] m);
//make a round if it's beyond Z
if (cypher[i] > 'Z')
{
cypher[i] = cypher[i] - 26;
}
}
// checking if it's lowercase
else if (islower(s[i]))
{
//if it falls beyond ascii table
if ((s[i] m) > 126)
{
cypher[i] = (s[i] - 26 m );
}
else
{
cypher[i] = (s[i] m);
}
//make a round if it's beyond z
if (cypher[i] > 'z')
{
cypher[i] = cypher[i] - 26;
}
}
}
// if it's not a letter - keep the initial character, write it in the cypher
else
{
cypher[i] = s[i];
}
}
printf("ciphertext: %sn", cypher);
return 0;
}
}
Комментарии:
1. каким-то образом нарушает работу кода . Пожалуйста, сообщите нам, какую ошибку или неправильное поведение вы наблюдаете.
2. Если вы закомментируете часть
for (int j = 0; j < strlen(argv[1]); j ) { if (!(isdigit(argv[1][j]))) { printf("Usage: ./caesar keyn"); return 1; } }
, она полностью корректна. Но когда я добавляю его, он выдает совершенно неправильные шифры.3.
char cypher[strlen(s)];
Вы не завершаете массив NUL. Что означает, что это недопустимая строка C. Если исправление по-прежнему не работает, пожалуйста, укажите точные входные данные, ожидаемый результат и фактический результат.4. @kaylum извините, не понял, что вы имеете в виду. Я объявляю массив символов размером, равным размеру строки s — той, которую вы получаете в качестве входных данных
5. Строки в C должны заканчиваться символом
''
(NUL). Таким образом, размер массива должен быть на единицу больше:char cypher[strlen(s) 1];
и затем, преждеprintf
чем вам понадобитсяcypher[i]='';
Ответ №1:
strlen в C не учитывает нулевой символ, длина массива должна быть [strlen(s) 1] и должен быть добавлен символ