C培训第九课作业时遇到的问题[结帖-添加作业到3楼]
本帖最后由 LShang 于 2010-12-31 16:38 编辑写这段代码用了将近4个小时的时间,本以为应该可以顺利完成的.
但是试运行是总是会出错,改了将近3个小时了,实在是头大.
现在脑袋嗡嗡的,一点思路都没有了...
所以把源码贴出来同学们帮我看下,到底是哪里出的问题.
bug为选择B功能,输入字符串时,回车后字符串消失.并且不执行下边代码.main()
{
unsigned char a={0};
char b={0};
char * c = "A.Encrypted String.";
char * d = "B.Decryption Key.";
int i ;
int j ;
while(*a != 'c')
{
clrscr();
printf("String encryption or decryption. By: LShang\n");
printf("Please select the function:\n");
printf("A.Encrypted String.\n");
printf("B.Decryption Key.\n");
printf("C.Exit.\n");
scanf(" %c",a);
if(*a == 'a')
{
i = 0;
while(i>=0)
{
clrscr();
printf("The current selection:");
printf("%s\n",c);
printf("Please enter a string.\n");
printf("String:");
scanf("%99s",a);
while(*(a+i))
{
i++;
}
i--;
printf("Encrypted String:");
while(i>=0)
{
printf("%X",*(a+i));
i--;
}
}
printf("\nPress 'q' return to the main menu.%c",8);
*a = getch();
}else if(*a == 'b')
{
i = 0;
j = 0;
while(i>=0)
{
clrscr();
printf("The current selection:");
printf("%s\n",d);
printf("Please enter the key.\n");
printf("Key:");
scanf("%99s",a);
while(*(a+i))
{
i++;
}
for(j=0;j<i;j++)
{
if((*(a+j)>='0') && (*(a+j)<='9'))
{
*(a+j) -= 0x30;
}else if((*(a+j)>='a') && (*(a+j)<='f'))
{
*(a+j) -= 0x57;
}else if((*(a+j)>='A') && (*(a+j)<='F'))
{
*(a+j) -= 0x37;
}else
{
printf("Error");
}
}
i--;
printf("Decrypted string:");
for(j=i;j>=0;j--)
{
if(!(j%2) && i>=0)
{
*(b+i)=(*(a+j)*0x10)+*(a+j+1);
printf("%c",*(b+i));
i--;
}
}
}
printf("\nPress 'q' return to the main menu.%c",8);
*a = getch();
}
clrscr();
}
}
大家帮我看看,是逻辑错误还是什么?为什么编译时候没问题... 找到问题了, 问题出在for(j=i;j>=0;j--)
{
if(!(j%2) && i>=0)
{
*(b+i)=(*(a+j)*0x10)+*(a+j+1);
printf("%c",*(b+i));
i--;
}
}
这个循环里,
因为 i--; 这条命令在if 语句里,
所以并不能实现每次减1.
也就不能实现自动退出while循环.
所以才会出现问题.
在此特别感谢FBI在QQ群中给出的提示.
不然我也不会知道原来while一直在循环.
最后讲下我自己的经验,
那就是看代码一定要去客观的阅读.
如果想当然的按照自己写代码是的想法去看.
那很可能永远都找不到问题在哪里.
________________________________________________________________
结帖 修改后的源码:main()
{
unsigned char a={0};
unsigned char b={0};
char * c = "A.Encrypted String.";
char * d = "B.Decryption Key.";
int i ;
int j ;
while(*a != 'c')
{
clrscr();
printf("String encryption and decryption. By: LShang\n");
printf("Please select the function:\n");
printf("A.Encrypted String.\n");
printf("B.Decryption Key.\n");
printf("C.Exit.\n");
scanf(" %c",a);
if(*a == 'a')
{
i = 0;
while(i>=0)
{
clrscr();
printf("The current selection:");
printf("%s\n",c);
printf("Please enter a string.\n");
printf("String:");
scanf("%99s",a);
while(*(a+i))
{
i++;
}
i--;
printf("Encrypted String:");
while(i>=0)
{
printf("%X",*(a+i));
i--;
}
}
printf("\nAny key to return to the main menu.%c",8);
*a = getch();
}else{}
if(*a == 'b')
{
i = 0;
j = 0;
while(i>=0)
{
clrscr();
printf("The current selection:");
printf("%s\n",d);
printf("Please enter the key.\n");
printf("Key:");
scanf("%99s",b);
while(*(b+i))
{
i++;
}
for(j=0;j<i;j++)
{
if((*(b+j)>='0') && (*(b+j)<='9'))
{
*(b+j) -= 0x30;
}else if((*(b+j)>='a') && (*(b+j)<='f'))
{
*(b+j) -= 0x57;
}else if((*(b+j)>='A') && (*(b+j)<='F'))
{
*(b+j) -= 0x37;
}else
{
printf("Error");
break;
}
}
i--;
printf("Decrypted string:");
for(j=i;j>=0;j--)
{
if(!(j%2) && i>=0)
{
*(a+i)=(*(b+j)*0x10)+*(b+j+1);
printf("%c",*(a+i));
}
i--;
}
}
printf("\nAny key to return to the main menu.%c",8);
*a = getch();
}
clrscr();
}
}
截图:
界面
加密
解密
源码附件:
需重命名
实现原理:取字符串16进制并倒叙排列.
第九课作业提交完毕
页:
[1]