我的Vignere Cipher会产生分段错误,我在读或写非法内存位置,还是我错误地使用指针?

时间:2016-09-06 22:09:20

标签: c encryption

我对此代码的意图是制作一个含糊量的密码。

我可以使用gcc编译我的代码,但是当我运行程序并在命令行中传递2个字符串时,我遇到了分段错误。最初我试图在我的for循环中使用单独的if语句来控制j的int值,例如:

if( i % strlen(msg) == 0) {
    j = 0;
}
else {
    j++;
}

但是,我不清楚这是否会产生我的预期结果,在这个if语句中执行表达式,然后继续下一个if语句。所以,我替换条件语句并编译代码。但是,在两个情况下,我使用j。

中的任一方法都会出现分段错误
#include <stdio.h>
#include <string.h>


int main(int argc, char *argv[]) {

char *msg = argv[1];
char *key = argv[2];
int i, j, sl, ky, mg;
sl = strlen(key);
j = 1;
int encrypt[strlen(msg)];

if(isalpha(key) && argc == 3) {
    ;
}
else
    perror("run program from cmd line with 2 strings \n");
    return 1;

for(i = 1; i <= sl; i++) {

    (i % strlen(key) == 0) ? j = 0 : j++;

    mg = msg[i];
    ky = key[j];

    if(isalpha(msg[i])) {

        if(isupper(msg[i])) {
            msg[i] = 'A' + (('A' - msg[i]) + ('A' - key[j]) % 26);
        }

        else if(islower(msg[i])) {
            msg[i] = 'a' + (('a' - msg[i]) + ('a' - key[j]) % 26);
        }
    else {
        msg[i] = msg[i];
    }
    }
}

return 0;

}

1 个答案:

答案 0 :(得分:-1)

好吧,我修正了一些疏忽,例如38行和42行。这段代码可以作为密码使用,但它只在某些时候有效。

for(i = 0; i < sl; i++) {

    (i % strlen(key) == 0) ? j = 0 : j++;

    mg = msg[i];
    ky = key[j];

    if(isalpha(msg[i])) {

        if(isupper(msg[i])) {
            encrypt[i] = 'A' + ((( msg[i] - 'A') + (key[j]) - 'A') % 26);
        }

        else if(islower(msg[i])) {
            encrypt[i] = 'a' + (((msg[i] - 'a') + (key[j]) - 'a') % 26);
        }
    else {
        encrypt[i] = msg[i];
    }
    }
}

for(i = 0; i < strlen(msg); i++) {

    printf("%c", encrypt[i]);