Неопределенное поведение (UB)
printf("ciphertext: %s\n", ciphertext);
пытается напечатать ciphertext
, предполагая, что это строка (последовательность символов, включающая и заканчивающаяся нулевым символом ), которой она не является.
strlen(ciphertext)
требуется строка .
В C вспомните строку , должна содержать нулевой символ , иначе это не строка . Для многих функций str...()
требуется строка .
Код может попытаться
printf("ciphertext: %.*s\n", (int) strlen(plaintext), ciphertext);
для печати массива символов до нулевого символа или до длины или строки plaintext
.
strlen(ciphertext)
просто неверно, поскольку ciphertext
не хватает нулевого символа .
Или рассмотрим
char ciphertext[strlen(plaintext) + 1]; // 1 more
size_t i;
for (i = 0; plaintext[i] != '\0'; i++) {
ciphertext[i] = plaintext[i]; // ciphertext is not yet a _string_.
}
ciphertext[i] = '\0'; // Now ciphertext is a _string_.
Также обратите внимание:
printf("length p: %lu\n", strlen(plaintext));
не так, как strlen()
возвращает size_t
, не обязательно unsigned long
.
Используйте соответствующий спецификатор и введите.
// printf("length p: %lu\n", strlen(plaintext));
printf("length p: %zu\n", strlen(plaintext));
Подсказка: приведенные ниже 2 являются функционально эквивалентными, вторая - идиоматической в C.
for (int i = 0, l = strlen(argv[1]); i < l; i++)
for (int i = 0; argv[1][i]; i++)
// of better
for (size_t i = 0; argv[1][i]; i++)
`