我用c语言编写了这个caesar密码程序,它运行正常,直到我提供key的整数值,但之后它崩溃了。任何人都可以请更正此代码?
#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的数组来解释崩溃。
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()。