原因在于scanf读取choice时,你输入的那个回车符没有被读取。然后接下来的case里面,getchar()读取的字符就是那个害死人的回车符'\n'。这是个老问题了,呵呵。希望你能从这个问题里面领悟到scanf之类的函数的工作原理。其实他们就是一种将字符串转化为预定义数据的函数。用户输入总是字符串,不是吗?
好吧,还是我帮你打一下吧。
/* 2011-11-14, 10:37 , 被 hoxily 修改。
* 恺撒加密。
*/
#include stdio.h
int main(void)
{
int choice;
char ch;
printf("1.加密 2.解密 3.退出\n");
scanf("%d",choice);
/* 注意这里 */
getchar();
/* 读掉那个'\n'字符 */
switch(choice)
{
case 1:
printf("输入需加密的字符串(仅限a~z):");
ch=getchar();
while(ch!='\n')
{
/* if(ch='a' ch'z') */
/* 这句也不对,没有包含'z' */
if('a'=ch ch='z')
ch='a'+(ch-'a'+3)%26;
putchar(ch);
ch=getchar();
}
break;
case 2:
printf("输入需解密的字符串:");
ch=getchar();
while(ch!='\n')
{
/* if(ch='a' ch'z') */
/* 理由同上 */
if('a'=ch ch='z')
/* ch='a'+(ch-'a'-3)%26; */
/* 注意这里%运算要保证被除数是非负数 */
/* 你之前的写法,输入'a'进行解密,结果是'^' */
ch='a'+(ch-'a'-3+26)%26;/* 加上个模不影响%的结果 */
putchar(ch);
ch=getchar();
}
break;
}
return 0;
}
/*
测试结果:
1.加密 2.解密 3.退出
1
输入需加密的字符串(仅限a~z):abcdefghijklmnopqrstuvwxyzABCXYZ
defghijklmnopqrstuvwxyzabcABCXYZPress any key to continue
1.加密 2.解密 3.退出
2
输入需解密的字符串:defghijklmnopqrstuvwxyzabcABCXYZ
abcdefghijklmnopqrstuvwxyzABCXYZPress any key to continue
1.加密 2.解密 3.退出
3
Press any key to continue
*/
#includestdio.h
int main()
{
int n;
char a,b;
printf("Enter shift amount(1-25):");
scanf_s("%d",n);
getchar();
printf("Enter message to be encrypted:");
while((a=getchar())!='\n')
{
if(a='A' a='Z')
b='A'+(a-'A'+n)%26;
else if(a='a' a='z')
b='a'+(a-'a'+n)%26;
putchar(b);
}
return 0;
}
恺撒密码最简单的那种就是将各个字母做一个简单的移位,复杂一些的恺撒密码2的话,就是对26个字母不是顺序的位移,而是不同的字母有不同的位移。这样的话,你就需要一个26个字母的密钥来给26个字母做加密和解密。
这个程序,允许输入一串小写英文,如:goodbey,然后将它们变成密码:jrrgehb。
变换规律是:按照英文字母表,明文字母向下第三个,就是密码。
见插图。
char M[100]; //明文、密码的存放空间
char C[100];
int K = 3, i; //K=3, 向下第三个
printf("请输入明文M(注意不要输入空白串)\n"); //显示
gets(M); //输入
for(i=0;M[i]!='\0';i++) //逐个字母进行变换
C[i]=(M[i]-'a'+K)%26+'a'; //加密计算公式
C[i]='\0'; //密码末尾加上终止符号
printf("结果是:\n%s\n",C); //显示密码