C 维格纳分段断层

C 维格纳分段断层,c,cs50,vigenere,C,Cs50,Vigenere,有人能解释为什么即使if语句是假的,h也要打印两次吗?我能够解决这个问题,但我仍在努力弄清楚为什么c会在每次迭代中输出不止一次 你可能会在这里找到你具体问题的答案,但如果你想解决它,并学到一些东西(这就是cs50的要点),请采取以下步骤: 先尝试在没有任何帮助的情况下解决它,如果不起作用,请进行下一步 观察并试着一步一步地做 如果你有一个看起来太难的问题,离开电脑,拿一支笔和一张纸,分析你的程序应该做什么,以及它实际做什么 学习使用调试器(在Cloud9CS50IDE中,调试器位于屏幕右侧)

有人能解释为什么即使if语句是假的,h也要打印两次吗?我能够解决这个问题,但我仍在努力弄清楚为什么c会在每次迭代中输出不止一次

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

  • 先尝试在没有任何帮助的情况下解决它,如果不起作用,请进行下一步
  • 观察并试着一步一步地做
  • 如果你有一个看起来太难的问题,离开电脑,拿一支笔和一张纸,分析你的程序应该做什么,以及它实际做什么
  • 学习使用调试器(在Cloud9CS50IDE中,调试器位于屏幕右侧)
  • 如果你的问题真的很难解决,关掉电脑,拿着一支笔和一张纸上床睡觉,你会惊讶地发现躺在床上解决问题是多么容易:)
当你运用这些步骤并解决你的问题时,你会获得一些解决类似问题的技能,你会觉得自己很聪明:)

如果你是一个完全的编程初学者,前面还有一些非常棘手的问题(破解、拼写等),但是如果你运用这些步骤,你就能解决所有问题。我知道,因为我知道,而且我不是一个超级聪明的C程序员,但我对“拼写器”的解决方案现在进入了前十名。

耐心点,祝你好运:)

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)