#include<stdio.h>
#include<cs50.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
int main(int argc, char** argv)
{
string p;
int c;
if (argc >= 2)
{
p = get_string("plaintext: ");
}
if (argc != 2 || isalpha(argv[1][0]) == false)
{
printf("ERROR\n");
return 1;
}
printf("ciphertext: ");
string k = argv[1];
int m = strlen(k);
for(int i = 0,j = 0, n = strlen(p); i < n; i++)
{
c = p[i] + k[j % m];
if(isupper(k[j % m]))
{
k[j % m] = k[j % m] - 'A';
}
if(islower(k[j % m]))
{
k[j % m] = k[j % m] - 'a';
}
if(isalpha(p[i]) == false)
{
printf("%c", p[i]);
}
if(islower(p[i]) && islower(c))
{
printf("%c", c);
j++;
}
if(isupper(p[i]) && isupper(c))
{
printf("%c",c);
j++;
}
if(isupper(p[i]) && !isupper(c))
{
c = ((c - 'A') % 26) + 'A';
printf("%c", c);
j++;
}
if(islower(p[i]) && !islower(c))
{
c = ((c - 'A') % 26) + 'A';
printf("%c",c);
j++;
}
else(printf("%c",c));
j++;
}
printf("\n");
}
Мне трудно понять, что не так с моим кодом. Когда я пытаюсь запустить его, я могу заставить его запросить у меня открытый текст, но я сталкиваюсь с ошибкой сегментации, если я попытаюсь пойти дальше. Я считаю, что это как-то связано с началом моего цикла for? Я не знаю, правильно ли я объявил переменную c
. Кроме этого, я действительно понятия не имею.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
plaintext: hello
ciphertext:
Breakpoint 1, main (argc=2, argv=0x7fffffffdf18) at vigenere.c:24
24 for(int i = 0,j = 0, n = strlen(p); i < n; i++)
(gdb)
(gdb) n
26 if(isupper(k[j % m]))
(gdb)
30 if(islower(k[j % m]))
(gdb)
32 k[j % m] = k[j % m] - 'a';
(gdb)
35 c = p[i] + k[j % m];
(gdb)
37 if(isalpha(p[i]) == false)
(gdb)
41 if(islower(p[i]) && islower(c))
(gdb)
43 printf("%c", c);
(gdb)
h44 j++;
(gdb)
46 if(isupper(p[i]) && isupper(c))
(gdb)
51 if(isupper(p[i]) && isupper(c) == false)
(gdb)
57 if(islower(p[i]) && islower(c) == false)
(gdb)
65 (printf("%c",c));
(gdb)
h66 j++;
(gdb)
68 }
(gdb)
24 for(int i = 0,j = 0, n = strlen(p); i < n; i++)
(gdb)
26 if(isupper(k[j % m]))
(gdb)
30 if(islower(k[j % m]))
(gdb)
32 k[j % m] = k[j % m] - 'a';
(gdb)
35 c = p[i] + k[j % m];
(gdb)
37 if(isalpha(p[i]) == false)
(gdb)
41 if(islower(p[i]) && islower(c))
(gdb)
43 printf("%c", c);
(gdb)
g44 j++;
(gdb)
46 if(isupper(p[i]) && isupper(c))
(gdb)
51 if(isupper(p[i]) && isupper(c) == false)
кто-нибудь может объяснить, почему h печатается дважды, хотя оператор if ложен? Мне удалось решить проблему, но я все еще пытаюсь понять, почему c будет выводить более одного раза для каждой итерации.
scanf
, поскольку у меня нет CS50, я запустил программу с аргументомqwerty
и ввел строкуantidisestablishmentarianism
, она выводитTM[]ZJSawwUttzzbewwyyPcdZeeSbyydewwd
, которая длиннее введенного текста. То же самое, но введенный текст былone two
, а вывод -HML
, что короче введенного текста. Кроме того: не используйте магические числа, такие как 65, используйте'A'
и т. д. - person Weather Vane   schedule 18.06.2018111
? Вы должны посмотреть на диаграмму, чтобы узнать, что это'o'
, или вы можете сделать код читаемым. В любом случае это может быть не ASCII. - person Weather Vane   schedule 18.06.2018printf("%x ", (unsigned int)(unsigned char)c);
) и проблемы должны стать очевидными... - person Serge Ballesta   schedule 18.06.2018k[j % m]
до настройки символа вk
в следующих строках. Вам также нужно еще несколькоelse
, потому чтоc
иногда выводится в цикле более одного раза. Вот почему выход длиннее, чем вход (мой плохой раньше, он не был короче). - person Weather Vane   schedule 18.06.2018else
, вам не придется повторять уже сделанные тесты, что сделает код более эффективным и простым для понимания. Всякий раз, когда вы выводитеc
, следующий код должен быть в блокеelse
. Это закроет дыры в логике потока. - person Weather Vane   schedule 18.06.2018printf
для каждого интересующего значения в любом интересном месте и проверьте, выполняет ли ваша программа то, что вы ожидаете. Использование отладчика является менее затратным способом. - person harper   schedule 18.06.2018