#include <stdio.h>
#include <string.h>
#include <malloc.h>
#define CRYPT_OK 1
#define CRYPT_ERROR 0
enum CRYPT_TYPE {ENCRYPT, DECRYPT};
int i,k;
char sequenceBuf[1024];
char * sequenceSrc = NULL;
char * sequenceDst = NULL;
int length;
int encrypt()
{
printf("Please input your SourceString:\n");
fflush(stdin); //清空输入缓冲区
fgets(sequenceBuf, sizeof(sequenceBuf), stdin);
printf("Please input your keyNum:\n");
scanf("%d",&k);
length = strlen(sequenceBuf);
sequenceSrc = (char *)malloc(length * sizeof(char));
for (i = 0; i < length - 1; i++)
sequenceSrc[i] = sequenceBuf[i];
sequenceSrc[length - 1] = '\0'; //字符串结束符
sequenceDst = (char *)malloc(length * sizeof(char));
for (i = 0; i < length - 1; i++)
sequenceDst[i]= 'a' + (sequenceSrc[i]-'a' + k)%26;
sequenceDst[length - 1]='\0';
return CRYPT_OK;
}
int decrypt()
{
printf("Please input your SourceString:\n");
fflush(stdin);
fgets(sequenceBuf, sizeof(sequenceBuf), stdin);
printf("Please input your keyNum:\n");
scanf("%d",&k);
length = strlen(sequenceBuf);
sequenceSrc = (char *)malloc(length * sizeof(char));
for (i = 0; i < length - 1; i++)
sequenceSrc[i] = sequenceBuf[i];
sequenceSrc[length - 1] = '\0';
sequenceDst = (char *)malloc(length * sizeof(char));
for (i = 0; i < length - 1; i++) {
sequenceDst[i]= 'a' + (sequenceSrc[i]-'a' + 26 - k)%26;
}
sequenceDst[length - 1]='\0';
return CRYPT_OK;
}
int main()
{
int choice = -1;
int result = 0;
printf("Encrypt:please input 0\nDecrypt:please input 1\nPlease choose:");
scanf("%d", &choice);
switch (choice)
{
case ENCRYPT :
result = encrypt();
break;
case DECRYPT :
result = decrypt();
break;
default:
printf("输入不合法\n");
break;
}
if (result)
{
printf("sequenceSrc:%s\n",sequenceSrc);
printf("sequenceDst:%s\n",sequenceDst);
}
return 0;
}
在加密解密函数中,当调用fgets函数前都执行了fflush(stdin);操作,此函数是为了清空输入缓冲区。
当连续从控制台读取数据时,前一个阶段输入的数据没有使用的缓冲会影响到下一个阶段的接收。
此例中主函数scanf函数接收一个整型,当回车表示结束时,整数被choice接收,但回车换行符还在缓冲区内。恰好fgets函数是以换行符为结束标志的,所以当进入子函数时,如果没有清空缓冲区,该条语句会快速被迫执行。反应到控制台上,似乎该条语句没执行,所以需要fflush清空缓冲区。