首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vigenere分割故障

Vigenere分割故障
EN

Stack Overflow用户
提问于 2018-06-18 15:07:22
回答 1查看 148关注 0票数 0
代码语言:javascript
复制
#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。除此之外,我真的一无所知。

代码语言:javascript
复制
[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在每次迭代中都会输出不止一次。

EN

回答 1

Stack Overflow用户

发布于 2018-06-21 22:08:45

您可能会在这里获得特定问题的答案,但如果您想要解决它,并学到一些东西(这就是cs50的要点),请执行以下步骤:

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

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

如果你是一个完全的编程初学者,前面有一些非常困难的问题(破解,拼写……),但是如果你应用这些步骤,你可以解决所有这些问题。我知道,因为我做到了,而且我不是一个C程序员,超级聪明或其他什么,但我的“拼写”解决方案现在是前十名。

要有耐心,祝你好运:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50904226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档