周立功

多分支选项的实现——控制台菜单(1)

0
阅读(3991)

    要想成为一名优秀的软件工程师,你必须对自己的代码精益求精,哪怕是最简单的问题也需要仔细考虑,在尽量减少Bug出现的可能性的同时还需要提高程序的扩展性。下面就举一个大家认为很简单,也非常熟悉的一个控制台菜单选项程序。

第一个版本V0.1使用if else做分支。这个可能是初学者最先想到的方式。
程序清单 1   V0.1版程序
void CmdRunning()
{
    int iCmdNum;
   
    do {
                  printf("请选择:0. 退出;1. 新建文件;2. 打开文件;3.保存文件\n");
                  scanf("%d",& iCmdNum);
                  if (0 == iCmdNum) {
                         printf("谢谢使用,再见!\n");
                  }
                  else if (1 == iCmdNum) {
                         CreateFile();
                  }
                  else if (2 == iCmdNum) {
                         OpenFile();
                  }
                  else if (3 == iCmdNum) {
                         SaveFile();
                 }
                 else {
                         printf("对不起,你选择的数字不存在,请重新选择!\n");
                 }
        }while(iCmdNum!=0);
}
    细心的同学可能会发现,这段程序存在一个很严重的Bug,比如,运行程序后输入字符’a’(非数字),回车,死循环出现了。为什么会出现这种情况呢?原因是scanf只能将缓冲区中的数字(使用了%d)读入iCmdNum,并清空缓冲区,而我们输入的是非数字,那么scanf读入失败,失败了它也就不会去清空缓冲区,这样造成的结果就是,我们不需要再输入其它字符,scanf每次都会去读缓冲区,每次都失败,每次都不会清空缓冲区,当下次再来读时发现缓冲区中有数据就不会停止等用户输入,接着又进入下一次的循环,死循环就形成了。另外If else方式在处理多分支时显繁琐并且效率低效,它必须一个一个分支地判断。而处理多分支比较容易想到的就是switch 语句了。为了避免出现V0.1中的死循环,我们后面的例子将使用另外一个输入函数。
 
    祝大家中秋快乐!我的一位朋友给我的短信“祝中秋乐在工作中”,于是发了这篇博文。对于初学者来说,这是一篇非常好的系列训练材料。