user-0 提问: 解密加密.c

回复:
user: user-1
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。

user: user-2
content: 引用 3 楼 abc594986308 的回复:[quote=引用 1 楼 gerrard0616 的回复:] 打印一下s[0]，看看里面存的是什么 改成scanf("%d\n",&n);接收掉一个回车就好了 接收是可以，但是在输入数字后，按回车就可以马上输入字符，而后提示“请输入字符”，后来才显示。[/quote] 2楼说的很到位了啊 输完了n的值后回车符'\n',程序继续执行，但是'\n'还在缓冲区里，在你后面用scanf接收字符时，你的'\n'还在，因此会存到s[0]中。 举个例子 输入4'\n'（回车） 然后输入ABCD 那么 你的s[0]-s[3]中实际存到的是"\nABC" 单步调试一下就能看见了。

user: user-0
content: 引用 2 楼 u011779875 的回复:[quote=引用 楼主 abc594986308 的回复:] /* *设计一个加密和解密的算法，在对一个指定的字符串 *加密之后，利用解密函数能够对密文解密，显示明文 *信息。加密的方式是将字符串中每个字符加上它在字符 *串中的位置和一个偏移值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] 非常感谢

user: user-0
content: 引用 1 楼 gerrard0616 的回复:打印一下s[0]，看看里面存的是什么 改成scanf("%d\n",&n);接收掉一个回车就好了 接收是可以，但是在输入数字后，按回车就可以马上输入字符，而后提示“请输入字符”，后来才显示。

user: user-3
content: 引用 楼主 abc594986308 的回复:/* *设计一个加密和解密的算法，在对一个指定的字符串 *加密之后，利用解密函数能够对密文解密，显示明文 *信息。加密的方式是将字符串中每个字符加上它在字符 *串中的位置和一个偏移值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 最后输入的回车 会保留在缓冲区  行缓冲 全缓冲  无缓冲的区别 百度看下

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