飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 5570|回复: 2

[C/C++] C培训第九课作业时遇到的问题[结帖-添加作业到3楼]

[复制链接]
  • TA的每日心情
    开心
    2015-12-28 01:47
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2010-12-31 14:39:51 | 显示全部楼层 |阅读模式
    本帖最后由 LShang 于 2010-12-31 16:38 编辑

    写这段代码用了将近4个小时的时间,本以为应该可以顺利完成的.
    但是试运行是总是会出错,改了将近3个小时了,实在是头大.
    现在脑袋嗡嗡的,一点思路都没有了...
    所以把源码贴出来同学们帮我看下,到底是哪里出的问题.
    bug为选择B功能,输入字符串时,回车后字符串消失.并且不执行下边代码.
    1. main()
    2. {
    3.         unsigned char a[99]={0};
    4.         char b[99]={0};
    5.         char * c = "A.Encrypted String.";
    6.         char * d = "B.Decryption Key.";
    7.         int i ;
    8.         int j ;
    9.         while(*a != 'c')
    10.         {
    11.                 clrscr();
    12.                 printf("String encryption or decryption.     By: LShang\n");
    13.                 printf("Please select the function:\n");
    14.                 printf("A.Encrypted String.\n");
    15.                 printf("B.Decryption Key.\n");
    16.                 printf("C.Exit.\n");
    17.                 scanf(" %c",a);
    18.                 if(*a == 'a')
    19.                 {
    20.                         i = 0;
    21.                         while(i>=0)
    22.                         {
    23.                                 clrscr();
    24.                                 printf("The current selection:");
    25.                                 printf("%s\n",c);
    26.                                 printf("Please enter a string.\n");
    27.                                 printf("String:");
    28.                                 scanf("%99s",a);
    29.                                 while(*(a+i))
    30.                                 {               
    31.                                         i++;
    32.                                 }
    33.                                 i--;
    34.                                 printf("Encrypted String:");
    35.                                 while(i>=0)
    36.                                 {      
    37.                                         printf("%X",*(a+i));
    38.                                         i--;
    39.                                 }
    40.                         }
    41.                         printf("\nPress 'q' return to the main menu.%c",8);
    42.                         *a = getch();
    43.                 }else if(*a == 'b')
    44.                 {
    45.                         i = 0;
    46.                         j = 0;
    47.                         while(i>=0)
    48.                         {
    49.                                 clrscr();
    50.                                 printf("The current selection:");
    51.                                 printf("%s\n",d);
    52.                                 printf("Please enter the key.\n");
    53.                                 printf("Key:");
    54.                                 scanf("%99s",a);
    55.                                 while(*(a+i))
    56.                                 {
    57.                                         i++;
    58.                                 }
    59.                                 for(j=0;j<i;j++)
    60.                                 {
    61.                                         if((*(a+j)>='0') && (*(a+j)<='9'))
    62.                                         {
    63.                                                 *(a+j) -= 0x30;
    64.                                         }else if((*(a+j)>='a') && (*(a+j)<='f'))
    65.                                         {
    66.                                                 *(a+j) -= 0x57;
    67.                                         }else if((*(a+j)>='A') && (*(a+j)<='F'))
    68.                                         {
    69.                                                 *(a+j) -= 0x37;
    70.                                         }else
    71.                                         {
    72.                                                 printf("Error");
    73.                                         }
    74.                                 }
    75.                                 i--;
    76.                                 printf("Decrypted string:");
    77.                                 for(j=i;j>=0;j--)
    78.                                 {
    79.                                         if(!(j%2) && i>=0)
    80.                                         {
    81.                                                 *(b+i)=(*(a+j)*0x10)+*(a+j+1);
    82.                                                 printf("%c",*(b+i));
    83.                                                 i--;
    84.                                         }
    85.                                 }
    86.                         }
    87.                         printf("\nPress 'q' return to the main menu.%c",8);
    88.                         *a = getch();
    89.                 }
    90.                 clrscr();
    91.         }
    92. }
    复制代码
    大家帮我看看,是逻辑错误还是什么?为什么编译时候没问题...
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-12-28 01:47
  • 签到天数: 3 天

    [LV.2]偶尔看看I

     楼主| 发表于 2010-12-31 16:22:39 | 显示全部楼层
    找到问题了, 问题出在
    1. for(j=i;j>=0;j--)

    2.                                 {

    3.                                         if(!(j%2) && i>=0)

    4.                                         {

    5.                                                 *(b+i)=(*(a+j)*0x10)+*(a+j+1);

    6.                                                 printf("%c",*(b+i));

    7.                                                 i--;

    8.                                         }

    9.                                 }

    复制代码
    这个循环里,
    因为 i--; 这条命令在if 语句里,
    所以并不能实现每次减1.
    也就不能实现自动退出while循环.
    所以才会出现问题.
    在此特别感谢FBI在QQ群中给出的提示.
    不然我也不会知道原来while一直在循环.
    最后讲下我自己的经验,
    那就是看代码一定要去客观的阅读.
    如果想当然的按照自己写代码是的想法去看.
    那很可能永远都找不到问题在哪里.
    ________________________________________________________________

    结帖
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-12-28 01:47
  • 签到天数: 3 天

    [LV.2]偶尔看看I

     楼主| 发表于 2010-12-31 16:37:24 | 显示全部楼层
    修改后的源码:
    1. main()
    2. {
    3.         unsigned char a[99]={0};
    4.         unsigned char b[99]={0};
    5.         char * c = "A.Encrypted String.";
    6.         char * d = "B.Decryption Key.";
    7.         int i ;
    8.         int j ;
    9.         while(*a != 'c')
    10.         {
    11.                 clrscr();
    12.                 printf("String encryption and decryption.     By: LShang\n");
    13.                 printf("Please select the function:\n");
    14.                 printf("A.Encrypted String.\n");
    15.                 printf("B.Decryption Key.\n");
    16.                 printf("C.Exit.\n");
    17.                 scanf(" %c",a);
    18.                 if(*a == 'a')
    19.                 {
    20.                         i = 0;
    21.                         while(i>=0)
    22.                         {
    23.                                 clrscr();
    24.                                 printf("The current selection:");
    25.                                 printf("%s\n",c);
    26.                                 printf("Please enter a string.\n");
    27.                                 printf("String:");
    28.                                 scanf("%99s",a);
    29.                                 while(*(a+i))
    30.                                 {               
    31.                                         i++;
    32.                                 }
    33.                                 i--;
    34.                                 printf("Encrypted String:");
    35.                                 while(i>=0)
    36.                                 {      
    37.                                         printf("%X",*(a+i));
    38.                                         i--;
    39.                                 }
    40.                         }
    41.                         printf("\nAny key to return to the main menu.%c",8);
    42.                         *a = getch();
    43.                 }else{}
    44.                 if(*a == 'b')
    45.                 {
    46.                         i = 0;
    47.                         j = 0;
    48.                         while(i>=0)
    49.                         {
    50.                                 clrscr();
    51.                                 printf("The current selection:");
    52.                                 printf("%s\n",d);
    53.                                 printf("Please enter the key.\n");
    54.                                 printf("Key:");
    55.                                 scanf("%99s",b);
    56.                                 while(*(b+i))
    57.                                 {
    58.                                         i++;
    59.                                 }
    60.                                 for(j=0;j<i;j++)
    61.                                 {
    62.                                         if((*(b+j)>='0') && (*(b+j)<='9'))
    63.                                         {
    64.                                                 *(b+j) -= 0x30;
    65.                                         }else if((*(b+j)>='a') && (*(b+j)<='f'))
    66.                                         {
    67.                                                 *(b+j) -= 0x57;
    68.                                         }else if((*(b+j)>='A') && (*(b+j)<='F'))
    69.                                         {
    70.                                                 *(b+j) -= 0x37;
    71.                                         }else
    72.                                         {
    73.                                                 printf("Error");
    74.                                                 break;
    75.                                         }
    76.                                 }
    77.                                 i--;
    78.                                 printf("Decrypted string:");
    79.                                 for(j=i;j>=0;j--)
    80.                                 {
    81.                                         if(!(j%2) && i>=0)
    82.                                         {
    83.                                                 *(a+i)=(*(b+j)*0x10)+*(b+j+1);
    84.                                                 printf("%c",*(a+i));
    85.                                         }
    86.                                 i--;
    87.                                 }
    88.                         }
    89.                         printf("\nAny key to return to the main menu.%c",8);
    90.                         *a = getch();
    91.                 }
    92.                 clrscr();
    93.         }
    94. }
    复制代码
    截图:
    界面

    界面

    界面

    加密

    加密

    加密

    解密

    解密

    解密

    源码附件:
    s.c.rar (3.82 KB, 下载次数: 7)
    需重命名
    实现原理:取字符串16进制并倒叙排列.
    第九课作业提交完毕
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表