是什么导致出现分段错误?

时间:2016-12-11 12:48:17

标签: c cs50 vigenere

如上所述运行程序显示分段错误。为什么会这样? 该程序适用于vigenere密码。我正在做的是将密钥存储在一个字符串中,然后存储key的整数值,就像我们在caesar密码中所做的那样,然后实现vigenere密码但是如果我编译它然后使用./a.out它会以某种方式显示分段错误培根。我无法弄清楚为什么会发生这种情况(导致分段错误的原因)。

#include<stdio.h>
#include<cs50.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
int main(int argc, string argv[])
{
    if((argc==2)&&(isalpha(argv[1])))
    {
        string k;
        k=argv[1];
        string p = GetString();
        int lenkey=strlen(k);
        int lenp=strlen(p);
        string c="hello";
        char temp;

        //change key to lowercase and store the shift value as in caesar
        for(int i=0;i<lenkey;i++)
        {
            temp=tolower(k[i]);
            k[i]=temp -'a';

        }
        int j=0;
        for(int i=0;i<lenp;i++)
        {
            //i is for plaintext j is for key
            if(isalpha(p[i]))
            {
                j++;
                if(j==(lenkey-1)) j=0;//reset the key if end is reached
                if(isupper(p[i]))
                {
                    p[i] = p[i]-'A';
                    c[i] = (p[i]+k[j])%26;
                    c[i] = c[i]+'A';
                }
                if(islower(p[i]))
                {
                    p[i] = p[i]-'a';
                    c[i] = (p[i]+k[j])%26;
                    c[i] = c[i]+'a';
                }
            }
            else
                c[i]=p[i];
        }

        printf("%s\n",c);
        return 0;
    }
    else
    {   printf("what?\n");
        return 1;
    }
}

1 个答案:

答案 0 :(得分:1)

关于atoi:“返回通过将输入字符解释为数字而产生的int值。如果输入无法转换为该类型的值,则返回值为0.

所以你的atoi(c) -'a'会失败并产生一个负数(c是字符串“hello”,不能解释为数字。)

可能你的意思是:

        temp=tolower(k[i]);
        k[i]=temp -'a';

<小时/> 以下也可能是错误:

    for(int i=0;i<lenp;i++) {
        ...
        c[i] = c[i]+'A';

因为i<lenp但必须是&lt;而c的长度为5。

除此之外,char *c="hello"使c成为常量字符串(文字),并且您无法修改文字。因此:seg错误。使用:

char c[]="hello";

(每个人,包括老师:放弃string!它会让所有人感到困惑!)