我已经用C语言编写了这个终止密码程序,但是每次运行它都会崩溃

时间:2018-09-07 19:53:54

标签: c encryption caesar-cipher

我已经用C语言编写了这个凯撒密码程序,在我提供密钥的整数值之前,它运行良好,但随后崩溃了。 有人可以更正此代码吗?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char alphabets[] = "abcdefghijklmnopqrstuvwxyz";
int arrow,key;
int search(char x)
{
    for(arrow=0;arrow<strlen(alphabets);arrow++)
    {

        if(x==alphabets[arrow])
        {
        return arrow;
        }
    }
}
char cipherGenerator(int arrow)
{
    arrow=arrow+key;
    if(arrow>strlen(alphabets))
    {
        arrow = (arrow%strlen(alphabets))-1;
    }
    return alphabets[arrow];
}

int main()
{
    char plain_text[]="",cipher_text[]="";
    int i;
    printf("Enter the plain text\n");
    gets(plain_text);
    printf("Enter the key\n");
    scanf("%d",&key);
    for(i=0;i<strlen(plain_text);i++)
    {
      strcat(cipher_text,cipherGenerator(search(plain_text[i])));
    }
    printf("The cipher text is %s:-",cipher_text);
    return 0;
}

1 个答案:

答案 0 :(得分:0)

可以通过尝试写入长度为1的数组来解释崩溃。

char plain_text[]="",cipher_text[]=""; //these arrays have length 1

gets(plain_text); //will fail and crash here
strcat(cipher_text,cipherGenerator(search(plain_text[i]))); //will crash here

关于gets的用法:

  

gets()函数不执行边界检查,因此此函数非常容易受到缓冲区溢出攻击。它不能被安全地使用(除非程序在限制stdin出现的环境中运行)。因此,该功能在第三更正版中已不支持C99标准,而在C11标准中已完全删除。推荐使用fgets()和gets_s()。

     

请勿使用gets()。