LShang 发表于 2010-12-31 14:39:51

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();
      }
}
大家帮我看看,是逻辑错误还是什么?为什么编译时候没问题...

LShang 发表于 2010-12-31 16:22:39

找到问题了, 问题出在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一直在循环.
最后讲下我自己的经验,
那就是看代码一定要去客观的阅读.
如果想当然的按照自己写代码是的想法去看.
那很可能永远都找不到问题在哪里.
________________________________________________________________

结帖

LShang 发表于 2010-12-31 16:37:24

修改后的源码: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]
查看完整版本: C培训第九课作业时遇到的问题[结帖-添加作业到3楼]