gpt4 book ai didi

c - 维吉尼亚段错误

转载 作者:行者123 更新时间:2023-11-30 16:30:51 25 4
gpt4 key购买 nike

#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)

任何人都可以解释为什么即使 if 语句是错误的, h 也会打印两次吗?我能够解决这个问题,但我仍然很难弄清楚为什么 c 每次迭代都会输出多次。

最佳答案

您可能会在这里找到您的具体问题的答案,但如果您想解决它并学习一些东西(这就是 cs50 的要点),请采取以下步骤:

  • 首先尝试在没有任何帮助的情况下解决问题,如果不起作用,请执行后续步骤,
  • 观看Zamyla's walkthrough并尝试一次一步地完成,
  • 如果您遇到的问题看起来太难,请离开计算机,拿起一支笔和一张纸,分析您的程序应该做什么以及它实际上做了什么,
  • 学习使用调试器(在 cloud9 cs50 IDE 中,它位于屏幕右侧),
  • 如果您的问题看起来真的非常很难关掉电脑,拿着笔和一张纸上床 sleep ,您会惊讶地发现躺着解决问题是多么容易:)

当您应用这些步骤并解决您的问题时,您将获得一些解决类似问题的技能,并且您会感到自己很聪明:)

如果您是编程的初学者,那么前面会遇到一些非常棘手的问题(破解、拼写......),但是如果您应用这些步骤,您就可以解决所有这些问题。我知道,因为我做到了,而且我不是专业的 C 程序员,也不是 super 聪明的人,但我的“拼写者”解决方案现在排在前 10 名。
要有耐心,祝你好运:)

关于c - 维吉尼亚段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50904226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com