Я создаю простую программу, которая шифрует строку открытого текста и превращает ее в зашифрованный текст с помощью ключа.
Вот пример.
$ ./substitution VCHPRZGJNTLSKFBDQWAXEUYMOI
plaintext: hello, world
ciphertext: jrssb, ybwsp
Как видите, он заменяет его в алфавитном порядке. V заменит A, C заменит B, H заменит C и так далее.
У меня вопрос: почему мои функции не принимают массив?
Мой код:
#include <cs50.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
bool alphabetic_char_checker(string word);
string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int main(int argc, string argv[])
{
if (argc != 26)
{
printf("The key must contain 26 characters.\n");
return 1;
}
if (alphabetic_char_checker(argv[]) == false)
{
printf("The key must only contain alphabetic characters.");
return 1;
}
}
bool alphabetic_char_checker(string word[])
{
for (int i = 0, w = strlen(word[]); i < w; i++)
{
word[i] = toupper(word[i]);
if (word[i] < 'a' || word[i] > 'z')
{
return false;
}
}
return true;
}
В настоящее время ваш код выдает несколько ошибок компиляции; пожалуйста, сначала исправьте их.
Что вообще такое string? Это недопустимый код C.
Намек: if (argc > 0 && strlen(argv[1]) != 26)
@MarcoBonelli Наверное, это жалкая зараза CS50.
C11 проект стандарта n1570: 6.7.6.3 Деклараторы функций (включая прототипы) 7 Объявление параметра как «массив типа» должно быть скорректировано на «квалифицированный указатель на тип», где квалификаторы типа (если есть) - те, которые указаны в [ и] производного типа массива [...]
@MarcoBonelli Если бы у меня было больше энергии, я бы направил большую часть ее на полное уничтожение CS50 и исключение его из истории.
Вы прописываете каждую букву в слове, затем сверяете ее с word[i] < 'a' || word[i] > 'z') в нижнем регистре.
@tadman Бро, мой профессор так и сделал. imgur.com/YTNtPhq
Ваш профессор входит в клику CS50, а? Мне жаль слышать, что тебе пришлось пережить это. Тест argc == 2 важен. Не говорите предполагать, что argc - это что-нибудь, пока вы его не протестируете.
Вы предполагаете, что argc - это какая-то длина строки. Это не так. Это количество предоставленных аргументов. argv[0] присутствует всегда, это имя самого исполняемого файла. Первый «реальный» аргумент - это argv[1], что означает, что argc (аргумент считать) должен быть 2. ./myprog a b c означает, что argc - это 4, как в четыре отдельных аргумента, включая имя команды.
@tadman О, хорошо, спасибо!
Ранее я уже отмечал необходимость strlen(), как в длина строки, не путать с количество аргументов. C не так уж и запутан. Это действительно очень, очень примитивно, и если вы ожидаете от него слишком многого, то можете запутаться. По замыслу все довольно просто. Во всяком случае, в некоторых случаях слишком просто.
@tadman Как сделать так, чтобы моя функция принимала аргумент командной строки [] в качестве входных данных?
alphabetic_char_checker(argv[]) - это ерунда. alphabetic_char_checker(argv[1]) - это ответ.
@tadman Большое спасибо! Это было очень полезно.





if (argc != 26)Это неправильно. Сделайте базовую отладку. Запустите вашу программу в отладчике или даже просто добавьте операторы отладочной печати, чтобы увидеть значениеargc. Затем просмотрите книгу / руководство по C по аргументам командной строки.