【问题标题】:CS50 PSet 2: Vigenere cipher Segmentation FaultCS50 PSet 2:Vigenere 密码分段错误
【发布时间】:2015-08-12 16:20:43
【问题描述】:

我是这个主题的新手。我尝试自己调试,但是 Segmentation Fault Core dumped 出现了,我不知道为什么。有人可以帮帮我吗?

# include<cs50.h>
# include<stdio.h>
# include<ctype.h>
# include<string.h>

int main(int argc, string argv[])

{
    int i, n, no;
    string s;
    string vige = NULL;
    string msg;
    s= argv[1];
    for (i = 0; n = strlen(s), i < n ; i++)
    {  
        if (argc != 2 || (!isalpha(s[i]) ))
        {
            printf("Error \n");
            return 1;
        }

    }   

           printf("Secret message: ");
            msg = GetString();

    for(i = 0; i < strlen(s) ; i++)
    {
        if(isupper(s[i]))
        {
            vige[i] = s[i] - 65;
        }
        else if(islower(s[i]))            {
            vige[i] = s[i] - 97;  
        }
    }
    for(i = 0; no = strlen(msg), i < no; i++)
    {
        if(isalpha(msg[i]))
        {
            if(islower(msg[i]))
            {  
               printf("%c", (msg[i] + (vige[i] % n)) + 97) ;
            }
            else if(isupper(msg[i]))
            {
                printf("%c", (msg[i] + (vige[i] % n)) + 65) ;
            }
            else
            {
                printf("%c", msg[i]);
            }
            return 0;
        }    
    }
}

如果有其他错误,我会自己解决,但是Segmentation fault超出了我的理解。

【问题讨论】:

  • gdb 说什么?
  • s= argv[1]; 如果我运行像./a.out 这样的二进制文件会怎样?然后,isalpha(s[i]....
  • 先把for (i = 0; n = strlen(s), i &lt; n ; i++)改成for (i = 0, n = strlen(s); i &lt; n ; i++)
  • @EugeneSh。或者,只是一个选项,将n = strlen(s); 完全移出for 循环语句。
  • 实际上发生了两次。

标签: c vigenere cs50


【解决方案1】:

vige 被初始化为NULL,但后来它使用索引符号vige[i] 取消引用,这是试图访问代码不拥有的内存,导致内存冲突和未定义的行为。

【讨论】: