一个简单的凯撒加密解密程序的fgets函数用法注意

来源:互联网 发布:淘宝数据包怎么上传 编辑:程序博客网 时间:2024/05/29 02:24
#include <stdio.h>#include <string.h>#include <malloc.h>#define CRYPT_OK 1#define CRYPT_ERROR 0enum 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清空缓冲区。

原创粉丝点击