C 维格纳分段断层
有人能解释为什么即使if语句是假的,h也要打印两次吗?我能够解决这个问题,但我仍在努力弄清楚为什么c会在每次迭代中输出不止一次 你可能会在这里找到你具体问题的答案,但如果你想解决它,并学到一些东西(这就是cs50的要点),请采取以下步骤:C 维格纳分段断层,c,cs50,vigenere,C,Cs50,Vigenere,有人能解释为什么即使if语句是假的,h也要打印两次吗?我能够解决这个问题,但我仍在努力弄清楚为什么c会在每次迭代中输出不止一次 你可能会在这里找到你具体问题的答案,但如果你想解决它,并学到一些东西(这就是cs50的要点),请采取以下步骤: 先尝试在没有任何帮助的情况下解决它,如果不起作用,请进行下一步 观察并试着一步一步地做 如果你有一个看起来太难的问题,离开电脑,拿一支笔和一张纸,分析你的程序应该做什么,以及它实际做什么 学习使用调试器(在Cloud9CS50IDE中,调试器位于屏幕右侧)
- 先尝试在没有任何帮助的情况下解决它,如果不起作用,请进行下一步
- 观察并试着一步一步地做
- 如果你有一个看起来太难的问题,离开电脑,拿一支笔和一张纸,分析你的程序应该做什么,以及它实际做什么
- 学习使用调试器(在Cloud9CS50IDE中,调试器位于屏幕右侧)
- 如果你的问题真的很难解决,关掉电脑,拿着一支笔和一张纸上床睡觉,你会惊讶地发现躺在床上解决问题是多么容易:)
耐心点,祝你好运:)
isalpha(argv[1])
==>isalpha(argv[1][0])
你试着调试这个问题吗?你不能用笔和纸来运行算法,向程序中添加一些调试输出,然后一步一步地检查什么不起作用?以及什么ASCII字符是111
?您必须查看图表才能知道它是'o'
,或者您可以使代码可读。无论如何,它可能不是ASCII。在调整以下行中k
中的字符之前,使用k[j%m]
启动循环。您还需要更多的else
s,因为c
有时会在循环中多次输出。这就是为什么输出比输入长的原因(我之前的错误,它并不短)。如果您无法或不愿意使用调试器,请在任何感兴趣的位置为每个感兴趣的值添加printf
,并检查您的程序是否达到预期效果。使用调试器是成本较低的方法。
#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");
}
[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)