读书人

解密加密.c,该如何解决

发布时间: 2013-10-27 15:21:50 作者: rapoo

解密加密.c
/*
*设计一个加密和解密的算法,在对一个指定的字符串
*加密之后,利用解密函数能够对密文解密,显示明文
*信息。加密的方式是将字符串中每个字符加上它在字符
*串中的位置和一个偏移值5.第一个字符“m”在字符串
*中的位置为0,那么它对应的密文是“'m'+0+5”,即r.
*依据题目信息。首先是加密函数
char *jm(char *str,int i,int m)
{
for(i=0;i<m;i++)
{
s[i]=s[i]+i+5;
}
return str;
}
再者,解密函数
char *jm1(char *str,int i,int m)
{
for(i=0;i<m;i++)
{
s[i]=s[i]-i-5;
}
return str;
}
main()
{
char s[100],int j,int n;
printf("你要输入的字符串字符的个数\n");
scanf("%d",&n);
printf("输入字符\n")
for(j=0;j<n;j++)
{
scanf("%c",s[j]);
}
jm(s,j,n);
for(j=0;j<n;j++)
{
printf("%c",s[j]);
}
jm1(s,j,n);
for(j=0;j<n;j++)
{
printf("%c",s[j]);
}
}
*/
#include <stdio.h>
char *jm(char *str,int i,int m)
{
for(i=0;i<m;i++)
{
str[i]=str[i]+i+5;
}
str[m]='\0';
return str;
}
/*再者,解密函数*/
char *jm1(char *str1,int k,int p)
{
for(k=0;k<p;k++)
{
str1[k]=str1[k]-k-5;
}
str1[p]='\0';
return str1;
}
main()
{
char s[100],q[100];
int j;
int n;
printf("你要输入的字符串字符的个数\n");
scanf("%d",&n);
printf("输入字符\n");
for(j=0;j<n;j++)
{
scanf("%c",&s[j]);
}
jm(s,j,n);
printf("加密后的字符串\n");
for(j=0;j<n;j++)
{
printf("%c",s[j]);
q[j]=s[j];
}
printf("\n解密后的字符串\n");
jm1(q,j,n);
printf("%c",q[0]);
for(j=0;j<n;j++)
{
printf("%c",q[j]);
}
printf("\n");
}
运行后解密函数运行完后怎么老是少一个字符。
c 算法 加密 解密
[解决办法]
打印一下s[0],看看里面存的是什么
改成scanf("%d\n",&n);接收掉一个回车就好了
[解决办法]

引用:
/*
*设计一个加密和解密的算法,在对一个指定的字符串
*加密之后,利用解密函数能够对密文解密,显示明文
*信息。加密的方式是将字符串中每个字符加上它在字符
*串中的位置和一个偏移值5.第一个字符“m”在字符串
*中的位置为0,那么它对应的密文是“'m'+0+5”,即r.
*依据题目信息。首先是加密函数
char *jm(char *str,int i,int m)
{
for(i=0;i<m;i++)
{
s[i]=s[i]+i+5;
}
return str;
}
再者,解密函数
char *jm1(char *str,int i,int m)
{
for(i=0;i<m;i++)
{
s[i]=s[i]-i-5;
}
return str;
}
main()
{
char s[100],int j,int n;
printf("你要输入的字符串字符的个数\n");
scanf("%d",&n);
printf("输入字符\n")
for(j=0;j<n;j++)
{
scanf("%c",s[j]);
}
jm(s,j,n);
for(j=0;j<n;j++)
{
printf("%c",s[j]);
}
jm1(s,j,n);
for(j=0;j<n;j++)
{
printf("%c",s[j]);
}
}
*/
#include <stdio.h>
char *jm(char *str,int i,int m)
{
for(i=0;i<m;i++)
{
str[i]=str[i]+i+5;
}
str[m]='\0';
return str;
}
/*再者,解密函数*/
char *jm1(char *str1,int k,int p)
{
for(k=0;k<p;k++)
{
str1[k]=str1[k]-k-5;
}
str1[p]='\0';
return str1;
}
main()
{
char s[100],q[100];
int j;
int n;
printf("你要输入的字符串字符的个数\n");
scanf("%d",&n);
printf("输入字符\n");
for(j=0;j<n;j++)
{
scanf("%c",&s[j]);
}
jm(s,j,n);
printf("加密后的字符串\n");
for(j=0;j<n;j++)
{
printf("%c",s[j]);
q[j]=s[j];
}
printf("\n解密后的字符串\n");
jm1(q,j,n);
printf("%c",q[0]);
for(j=0;j<n;j++)
{
printf("%c",q[j]);
}
printf("\n");
}
运行后解密函数运行完后怎么老是少一个字符。


scanf("%d",&n);
scanf("%c",s[j]);
连用的情况请在中间加入
getchar();
或者fflush(stdin);

原因是scanf的实现 %d是按空格区分的
但是 %c可是无条件接收的
scanf %d 最后输入的回车 会保留在缓冲区

行缓冲 全缓冲 无缓冲的区别 百度看下
[解决办法]
引用:
Quote: 引用:

打印一下s[0],看看里面存的是什么
改成scanf("%d\n",&n);接收掉一个回车就好了

接收是可以,但是在输入数字后,按回车就可以马上输入字符,而后提示“请输入字符”,后来才显示。


2楼说的很到位了啊
输完了n的值后回车符'\n',程序继续执行,但是'\n'还在缓冲区里,在你后面用scanf接收字符时,你的'\n'还在,因此会存到s[0]中。
举个例子
输入4'\n'(回车)
然后输入ABCD
那么
你的s[0]-s[3]中实际存到的是"\nABC"
单步调试一下就能看见了。
[解决办法]
在每个最后不带\n的printf后面加fflush(stdout);
在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);
另外请检查scanf的返回值。

读书人网 >C语言

热点推荐